我在台式机上进行开发,台式机有 Titan X 卡(麦克斯韦架构)。但是,生产代码运行在具有 K40 卡(开普勒架构)的服务器上。
我如何构建我的代码以便它在两个系统上都以最佳方式运行?
到目前为止,我已经使用过,compute_20,sm_20但我认为这个设置不是最佳的。
假设我想在我编写的某些源代码上使用 CUDA 的较低级别驱动程序 API。我知道cuLaunchKernel,但我似乎无法在文档中找到如何cuFunction从函数传递给它的确切解释__global__。
我正在尝试编译一个 C 程序来尝试并行编程,当我尝试使用 nvcc 编译器(Nvidia)编译它时,它给了我这些错误:
inicis.cu(3): error: attribute "global" does not apply here
inicis.cu(3): error: incomplete type is not allowed
inicis.cu(3): error: identifier "a" is undefined
inicis.cu(3): error: expected a ")"
inicis.cu(4): error: expected a ";"
/usr/include/_locale.h(68): error: expected a declaration
inicis.cu(20): error: type name is not allowed
inicis.cu(21): error: type name is not allowed
inicis.cu(22): error: type name is not allowed
inicis.cu(41): error: identifier "dev_a" is undefined
inicis.cu(42): error: identifier "dev_b" is undefined
inicis.cu(43): error: identifier "dev_c" is undefined …Run Code Online (Sandbox Code Playgroud) 我试图从另一个内核调用CUDA内核,但得到以下错误:
Traceback (most recent call last):
File "C:\temp\GPU Program Shell.py", line 22, in <module>
""")
File "C:\Python33\lib\site-packages\pycuda\compiler.py", line 262, in __init__
arch, code, cache_dir, include_dirs)
File "C:\Python33\lib\site-packages\pycuda\compiler.py", line 252, in compile
return compile_plain(source, options, keep, nvcc, cache_dir)
File "C:\Python33\lib\site-packages\pycuda\compiler.py", line 134, in compile_plain
cmdline, stdout=stdout.decode("utf-8"), stderr=stderr.decode("utf-8"))
pycuda.driver.CompileError: nvcc compilation of c:\users\karste~1\appdata\local\temp\tmpgq8t45\kernel.cu failed
[command: nvcc --cubin -arch sm_35 -m64 -Ic:\python33\lib\site-packages\pycuda\cuda kernel.cu]
[stderr:
kernel.cu(14): error: kernel launch from __device__ or __global__ functions requires separate compilation mode
Run Code Online (Sandbox Code Playgroud)
我的理解是,这与动态并行性有关,而与此错误相关的另一个问题是由于用户没有适当的硬件.我有一个GTX Titan,所以它应该是兼容的.我错过了什么?
编辑
添加"options = [' …
我正在尝试在Ubuntu上使用nvcc编译CUDA代码.但是,当我这样做时,我得到了这个输出:
> make
/usr/local/cuda/bin/nvcc -m64 --ptxas-options="-v" -gencode arch=compute_11,code=sm_11 -gencode arch=compute_13,code=sm_13 -gencode arch=compute_20,code=sm_20 -gencode arch=compute_30,code=sm_30 -gencode arch=compute_35,code=sm_35 -o main main.cu
gcc: No such file or directory
make: *** [main] Error 1
Run Code Online (Sandbox Code Playgroud)
即使我正在尝试编译只包含主函数的文件,它仍然无效:
> /usr/local/cuda/bin/nvcc main.cu
gcc: No such file or directory
Run Code Online (Sandbox Code Playgroud)
nvcc似乎对--version有所反应,所以它肯定存在.我不知道为什么它会调用gcc.
我正在尝试用它来构建一个项目nvcc.我收到了nvlink error:我见过的最令人烦恼的消息.
这是链接声明:
nvcc -rdc=true -arch=sm_21 -O3 -Xcompiler -fPIC -I"/usr/local/ACE_wrappers" -I"/usr/local/ACE_wrappers/TAO" -I"/usr/local/DDS" -I"/usr/include/Qt" -I"/usr/include/QtCore" -I"/usr/include/QtGui" -I"../../include" -I"../../include/DDS" -I"../../include/CoordinateTransforms" -I"../../include/DDS/IDLBrokerTemplates" -I"../../def/IDL" -I"../../def/CMD" -I"../../def/XSD" -I"../../src/NetAcquire" -I"/usr/local/ACE_wrappers/TAO/orbsvcs" -I"/usr/local/include/lct.7.5.4" -L"." -L"/usr/local/ACE_wrappers/lib" -L"/usr/local/DDS/lib" -L"/usr/lib64" -L"/usr/local/lib64" -L"../../def/IDL/lib" -L"../../def/XSD" -L"/usr/local/lib" .obj/../../src/Component.o .obj/../../src/COM.o .obj/../../src/DDS/EntityManager.o .obj/../../src/IDLBrokerTemplates/CommandManager.o .obj/../../src/IDLBrokerTemplates/OptionManager.o .obj/../../include/ApplicationProcessStateReporter_moc.o .obj/../../src/Application.o .obj/../../src/CoordinateTransforms/Site.o .obj/../../src/CoordinateTransforms/Geodesy.o .obj/../../src/CoordinateTransforms/Earth.o .obj/../../src/CoordinateTransforms/StateVector.o .obj/../../src/CoordinateTransforms/KeplerianImpact.o .obj/../../src/CoordinateTransforms/GeodeticPosition.o .obj/../../src/IDLBrokerTemplates/MeasurandSubscription.o .obj/../../src/NetAcquire/NetAcquire.o .obj/DataLossFlightTimeImpl.o .obj/DataLossFlightTime.o .obj/DftTable.o .obj/OptionListener.o .obj/PrimaryListener.o .obj/MissionTimeListener.o .obj/DeadMan.o .obj/main.o .obj/../../src/XML/spline.o .obj/../../src/XML/FpTable.o -l"naps-x86_64" -l"naio-x86_64" -l"nalct-x86_64" -l"curl" -l"TAO_Messaging" -l"TAO_Valuetype" -l"TAO_PI_Server" -l"TAO_PI" -l"TAO_CodecFactory" -l"TAO_CosNaming" -l"armadillo" -l"boost_filesystem" -l"boost_system" -l"xerces-c" -l"jarssXSD" -l"OpenDDS_Tcp" -l"JARSSRTv10" -l"QtNetwork" …Run Code Online (Sandbox Code Playgroud) 我正在做一些测试,我意识到在编译时使用-G参数会给我一个糟糕的表现,而不是没有它.
我查看了Nvidia的文档:
--device-debug (-G)
Generate debug information for device code.
Run Code Online (Sandbox Code Playgroud)
但它并没有帮助我知道为什么给我这么糟糕的表现.它在哪里产生这个调试信息?何时?这可能是造成这种糟糕表现的原因?
我一直在阅读与常量内存相关的许多SO问题,但我仍然不明白为什么我的程序无效.总的来说,它看起来如下
Common.cuh
__constant__ int numElements;
__global__
void kernelFunction();
Run Code Online (Sandbox Code Playgroud)
Common.cu
#include "Common.cuh"
#include <stdio.h>
__global__
kernelFunction()
{
printf("NumElements = %d", numElements);
}
Run Code Online (Sandbox Code Playgroud)
Test.cu
#include "Common.cuh"
int main()
{
int N = 100;
cudaMemcpyToSymbol(numElements,&N,sizeof(int));
kernelFunction<<<1,1>>>();
cudaDeviceSynchronize();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它编译时没有错误,但是当打印numElementsI 的值时,只获得一个随机值.有人能指出我正确的方向来理解这一点吗?
这只是我注意到的事情,如果有理由的话,我很好奇.
使用Nvidia的nvcc编译器从Ubuntu 14.04上的cuda 7.0工具包编译一些标准的helloworld代码会产生以下大小的可执行文件:
liang@liang-EX58-UD3R:~/Documents/cuda-test$ nvcc cudahello.cu -o cudahello
liang@liang-EX58-UD3R:~/Documents/cuda-test$ ls -lah cudahello
-rwxrwxr-x 1 liang liang 508K Jun 25 12:08 cudahello
Run Code Online (Sandbox Code Playgroud)
该程序只是一个简单的hello world程序,没有内核调用:
//cudahello.cu
#include <iostream>
int main(){
std::cout << "helloworld\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
另一方面,OpenCL更多是C++可执行文件的预期大小:
liang@liang-EX58-UD3R:~/Documents/opencl-test$ g++ -Wall -std=c++11 oclhello.cpp -lOpenCL -o oclhello
liang@liang-EX58-UD3R:~/Documents/opencl-test$ ls -lah oclhello
-rwxrwxr-x 1 liang liang 8.9K Jun 25 12:08 oclhello
Run Code Online (Sandbox Code Playgroud)
这也是一个简单的helloworld计划:
//oclhello.cpp
#include <CL/cl.h>
#include <iostream>
int main(){
std::cout << "helloworld";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
CUDA可执行文件是否有相当大的原因?我发现即使在C/C++程序中使用OpenCL函数,可执行文件也不会增长到CUDA可执行文件的大小.
我的目标是:library2.so正在使用library1.so和mycode.o正在使用(库应该链接)library2.so(也许library1.so).
源代码是(省略一行头文件):
library1.cu:
__device__ void func1_lib1(void){}
Run Code Online (Sandbox Code Playgroud)
library2.cu:
#include "library1.h"
__global__ void func1_lib2(void)
{
func1_lib1();
}
extern "C"
void func2_lib2(void)
{
func1_lib2<<<1,1>>>();
}
Run Code Online (Sandbox Code Playgroud)
mycode.c中:
#include "library2.h"
int main(void)
{
func2_lib2();
}
Run Code Online (Sandbox Code Playgroud)
我正在根据 Makefile 构建共享库
broken:
rm -f *.o *.so
nvcc -arch=sm_30 --compiler-options '-fPIC' -dc library1.cu
nvcc -arch=sm_30 --compiler-options '-fPIC' -dlink -o cuda-lib1.o library1.o
gcc -shared -Wl,-soname,library1.so -o library1.so library1.o uda-lib1.o
nvcc -arch=sm_30 --compiler-options '-fPIC' -dc library2.cu
nvcc -arch=sm_30 --compiler-options '-fPIC' …Run Code Online (Sandbox Code Playgroud) 我有一个模板化的静态CUDA库,我希望将其包含在一个通用的c ++项目中.当我包含库的头文件时,编译器崩溃并说它无法解析特定于CUDA的符号.当然g ++编译器无法解释这些符号.我知道这个问题,但我不知道如何使用nsight IDE解决这个问题.
我正在使用nsight,cuda/nvcc库和c ++/g ++项目.
控制台输出:
make all
Building file: ../src/MedPrak.cpp
Invoking: GCC C++ Compiler
g++ -I/home/voodoocode/Praktikum/MedPrak/PrivateRepo/MedPrakCuda/src -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/MedPrak.d" -MT"src/MedPrak.d" -o "src/MedPrak.o" "../src/MedPrak.cpp"
In file included from ../src/cudaWrapper.cu:8:0,
from ../src/MedPrak.cpp:3:
/home/voodoocode/Praktikum/MedPrak/PrivateRepo/MedPrakCuda/src/kernel.h:15:23: error: ‘__global__’ does not name a type
template <typename T> __global__ void squareVector(T *input, T *output, int size) {
Run Code Online (Sandbox Code Playgroud)
编辑:忘了提到我有一个cuda项目,其文件与库中的文件相同.cuda项目编译正常并且运行正常,所以我认为我的代码中没有大的错误.
Edit2:避免"模板库"的想法.我有一个围绕实际模板类的包装器.所以没有"空"库.
在我的cuda设备代码中,我正在检查,其中我减去线程的id和blockDim以查看天气与否,我可能想要使用的数据在范围内.但是当这个数字低于0时,它似乎又回到了最大值.
#include <iostream>
#include <cuda_runtime.h>
#include <device_launch_parameters.h>
float input[] =
{
1.5f, 2.5f, 3.5f,
4.5f, 5.5f, 6.5f,
7.5f, 8.5f, 9.5f,
};
__global__ void underflowCausingFunction(float* in, float* out)
{
int id = (blockDim.x * blockIdx.x) + threadIdx.x;
out[id] = id - blockDim.x;
}
int main()
{
float* in;
float* out;
cudaMalloc(&in, sizeof(float) * 9);
cudaMemcpy(in, input, sizeof(float) * 9, cudaMemcpyHostToDevice);
cudaMalloc(&out, sizeof(float) * 9);
underflowCausingFunction<<<3, 3>>>(in, out);
float recivedOut[9];
cudaMemcpy(recivedOut, out, sizeof(float) * 9, cudaMemcpyDeviceToHost);
cudaDeviceSynchronize();
std::cout << recivedOut[0] << " …Run Code Online (Sandbox Code Playgroud) 我是nvcc的新手,我见过一个库,用g ++和nvcc选项-O3进行编译.
CC=g++
CFLAGS=--std=c++11 -O3
NVCC=nvcc
NVCCFLAGS=--std=c++11 -arch sm_20 -O3
Run Code Online (Sandbox Code Playgroud)
什么是-O3在做什么?