Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CUDA内核未启动,CMAKE Visual Studio 2015项目_Cuda - Fatal编程技术网

CUDA内核未启动,CMAKE Visual Studio 2015项目

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

我有一个相对简单的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 = 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