CUDA内核未启动,CMAKE Visual Studio 2015项目
我有一个相对简单的CUDA内核,我立即以以下方式在程序的主方法中调用该内核:CUDA内核未启动,CMAKE Visual Studio 2015项目,cuda,Cuda,我有一个相对简单的CUDA内核,我立即以以下方式在程序的主方法中调用该内核: __global__ void block() { for (int i = 0; i < 20; i++) { printf("a"); } } int main(int argc, char** argv) { block << <1, 1 >> > (); cudaError_t cudaerr = cudaDeviceS
__global__ void block() {
for (int i = 0; i < 20; i++) {
printf("a");
}
}
int main(int argc, char** argv) {
block << <1, 1 >> > ();
cudaError_t cudaerr = cudaDeviceSynchronize();
printf("Kernel executed!\n");
if (cudaerr != cudaSuccess)
printf("kernel launch failed with error \"%s\".\n",
cudaGetErrorString(cudaerr));
}
我希望这个程序的输出将20个A打印到控制台,然后以执行打印内核结束。但是,A永远不会打印到控制台,执行的内核行会立即显示出来。即使我用while(true)
循环替换for循环
即使在运行附加了Nsight调试器且内核for循环中有断点的代码时,也不会发生任何事情。这让我相信内核从未真正启动过。有人知道如何使此内核按预期运行吗?使用给定的
CMakeLists.txt
文件编译时,内核未正确运行的原因是由于以下标志:
-arch=compute_30 -code=sm_30
与正在使用的GPU(GTX 970,cc 5.2 GPU)结合使用
这些标志仅为cc 3.0 SASS代码,此类代码与cc 5.2设备不兼容。修复方法是将标志修改为如下内容:
-arch=sm_30
或
或
我推荐第一种或第二种方法,因为它将包括对未来设备的PTX支持
内核错误不明显,因为内核后的错误检查不完整。请参阅。如果在main()末尾添加对CUDADeviceSet的调用,会发生什么情况?无需执行任何操作,它只返回cudasuccess代码。系统中有什么GPU?您使用的GPU驱动程序版本是什么?哪一个CUDA版本?您发布的代码对我来说非常适合。如果main末尾的
cudaDeviceReset()
没有区别,那么我们可以排除缓冲区刷新问题,在这种情况下,问题在于您没有描述的内容,或者您有某种类型的CUDA安装问题。很难解决无法复制的问题……这是一个问题:-arch=compute_30-code=sm_30
,因为它与您的GTX 970不匹配,而且它也不强制包含PTX,这将允许代码的前向兼容性(JIT编译)。如果您将其更改为与您的GPU匹配(例如,只需-arch=sm_52
,或-arch=compute_52-code=sm_52
),那么它应该开始为您工作。如果在内核调用之后使用,至少可以知道问题所在。
-arch=sm_30
-arch=sm_52
-arch=compute_52 -code=sm_52