CUDA 11内核不运行 [英] cuda 11 kernel doesn't run
本文介绍了CUDA 11内核不运行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
这里是一个demo.cu
目标是从GPU设备打印f:
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>
__global__ void hello_cuda() {
printf("hello from GPU
");
}
int main() {
printf("hello from CPU
");
hello_cuda <<<1, 1>>> ();
cudaDeviceSynchronize();
cudaDeviceReset();
printf("bye bye from CPU
");
return 0;
}
它编译并运行:
$ nvcc demo.cu
$ ./a.out
这是我得到的输出:
hello from CPU
bye bye from CPU
Q:为什么GPU没有打印结果?
看起来确实像是我错误地配置了cuda工具箱之类的东西,但是我能够从cuda-sample编译和运行各种程序。例如,matrixMul或deviceQuery推荐答案
如果您的设备具有3.0或更低的计算能力,CUDA11将放弃对这些GPU的支持。您需要使用a prior CUDA version。
CUDA编译器必须针对GPU目标(即设备体系结构)进行编译。如果您没有在编译命令行上specify a target architecture,CUDA过去选择了非常灵活的默认体系结构规范,该规范可以在CUDA版本支持的所有GPU上运行。
但是,That isn't always the case与CUDA 11不同。CUDA 11编译为默认架构sm_52
(计算能力5.2,即好像您在命令行上指定了-arch=sm_52
)。但CUDA 11支持低至sm_35
(计算能力3.5)的体系结构。
因此,如果您不在CUDA 11的编译命令行中指定目标体系结构,并尝试在sm_52
之前的体系结构的GPU上运行,则您编写的任何CUDA代码(内核)肯定不会工作。
只要您在使用CUDA代码时遇到问题,都可以使用proper CUDA error checking,这是一种很好的做法,如果您在这里这样做了,您就会得到一个运行时错误指示,可以立即发现问题(至少对于熟悉CUDA错误的人来说是这样)。
这些情况下的解决方案是指定包含要在其上运行的GPU的编译命令(无论如何,这通常都是很好的做法)。如果您执行此操作,并且您指定的体系结构已弃用&q;,则nvcc
编译器将发出警告,通知您未来的CUDA版本可能不支持您尝试运行的GPU。该警告并不意味着您正在执行的任何操作都是错误或非法的,或者需要更改,但它意味着将来的CUDA版本可能不支持该GPU。
如果要取消该警告,可以在编译命令行上传递-Wno-deprecated-gpu-targets
开关。
当然,同样的问题也可能发生在Windows上。在这种情况下,您需要修改以下VS项目设置以匹配您设备的体系结构:
这篇关于CUDA 11内核不运行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文