我的应用程序使用 CUDA 内核进行大部分计算。出于充分的理由(超出此问题的范围),我使用共享对象/链接模型来动态加载对象文件,每个对象文件都包含 1 个主机函数和 1 个 CUDA 内核。由于内核不能是extern
这样一个内核的基本结构是:
__global__ kernel() { ...code... }
extern "C" void call_kernel() {
<<<GRID,BLOCK,SHMEM>>>kernel();
}
我使用一个主机函数,其唯一目的是调用内核。为了构建我使用的共享对象:
nvcc -arch=sm_20 -m64 --compiler-options -fPIC,-shared -link -o kernel0.o kernel0.cu
整个应用程序使用了大量这些内核,并且它们加载了dlopen()
. 如果一切(构建/加载/执行)都在一台机器 A 上,那么整个事情就可以正常工作。
但是,当我在机器 B(cuda 4.1,NVIDIA C2050)上编译/构建共享对象时,然后dlopen
在机器 A(cuda 4.0,GTX 480)上编译/构建共享对象时,计算不会产生与也构建共享对象相同的结果在机器 A 上。
这对我来说听起来很奇怪。文件中是否没有嵌入.o
包含独立于特定 GPU 架构的指令的 CUBIN 对象?
我知道建议使用相同的编译器版本进行构建和链接。同样,我有充分的理由为什么不在执行共享对象的同一台机器上构建共享对象。