cuda 11内核不';跑不动
下面是一个cuda 11内核不';跑不动,cuda,printf,nvidia,Cuda,Printf,Nvidia,下面是一个demo.cu,旨在从GPU设备打印F: #include "cuda_runtime.h" #include "device_launch_parameters.h" #include <stdio.h> __global__ void hello_cuda() { printf("hello from GPU\n"); } int main() { printf("
demo.cu
,旨在从GPU设备打印F:
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>
__global__ void hello_cuda() {
printf("hello from GPU\n");
}
int main() {
printf("hello from CPU\n");
hello_cuda <<<1, 1>>> ();
cudaDeviceSynchronize();
cudaDeviceReset();
printf("bye bye from CPU\n");
return 0;
}
这就是我得到的输出:
hello from CPU
bye bye from CPU
问:为什么GPU没有打印结果
看起来好像我对cuda工具包或其他东西的配置有误,但是我能够从cuda示例编译和运行各种程序。例如,如果您的设备的计算能力为3.0或更低,CUDA 11将放弃对这些GPU的支持。你需要使用 CUDA编译器必须针对GPU目标(即设备架构)进行编译。如果您不使用compile命令行,历史上,CUDA选择了一个非常灵活的默认体系结构规范,可以在CUDA版本支持的所有GPU上运行 然而,CUDA 11并非如此。CUDA 11编译的默认体系结构为
sm_52
(计算能力5.2,即,就像您在命令行上指定了-arch=sm_52
)。但CUDA 11支持低至sm_35
(计算能力3.5)的体系结构
因此,如果您不使用CUDA 11在编译命令行上指定目标体系结构,并尝试使用早于sm_52
的体系结构在GPU上运行,那么您编写的任何CUDA代码(内核)都肯定无法工作
这是一个很好的实践,当您在使用CUDA代码时遇到问题,如果您在这里这样做了,您会得到一个运行时错误指示,该指示会立即发现问题(至少对于熟悉CUDA错误的人来说) 在这些情况下,解决方案是指定一个编译命令,该命令包含要在其上运行的GPU(无论如何,这通常是一个很好的实践)。如果您这样做,并且您指定的体系结构是“不推荐的”,那么
nvcc
编译器将发出警告,告知您未来的CUDA版本可能不支持您尝试运行的GPU。警告并不意味着你所做的任何事情都是错误的、非法的或需要更改的,但它意味着将来,未来的CUDA版本可能不支持该GPU
如果要抑制该警告,可以在compile命令行上传递-Wno deprecated gpu targets
开关
当然,同样的问题也可能发生在windows上。在这种情况下,您需要修改以下VS project设置以匹配设备的体系结构:
如果您的设备具有3.0或更低的计算能力,CUDA 11将放弃对这些GPU的支持。你需要使用 CUDA编译器必须针对GPU目标(即设备架构)进行编译。如果您不使用compile命令行,历史上,CUDA选择了一个非常灵活的默认体系结构规范,可以在CUDA版本支持的所有GPU上运行 然而,CUDA 11并非如此。CUDA 11编译的默认体系结构为
sm_52
(计算能力5.2,即,就像您在命令行上指定了-arch=sm_52
)。但CUDA 11支持低至sm_35
(计算能力3.5)的体系结构
因此,如果您不使用CUDA 11在编译命令行上指定目标体系结构,并尝试使用早于sm_52
的体系结构在GPU上运行,那么您编写的任何CUDA代码(内核)都肯定无法工作
这是一个很好的实践,当您在使用CUDA代码时遇到问题,如果您在这里这样做了,您会得到一个运行时错误指示,该指示会立即发现问题(至少对于熟悉CUDA错误的人来说) 在这些情况下,解决方案是指定一个编译命令,该命令包含要在其上运行的GPU(无论如何,这通常是一个很好的实践)。如果您这样做,并且您指定的体系结构是“不推荐的”,那么
nvcc
编译器将发出警告,告知您未来的CUDA版本可能不支持您尝试运行的GPU。警告并不意味着你所做的任何事情都是错误的、非法的或需要更改的,但它意味着将来,未来的CUDA版本可能不支持该GPU
如果要抑制该警告,可以在compile命令行上传递-Wno deprecated gpu targets
开关
当然,同样的问题也可能发生在windows上。在这种情况下,您需要修改以下VS project设置以匹配设备的体系结构:
每当您在使用CUDA代码时遇到问题时,最好将其包括在内。我猜您正在使用CUDA11,因此编译的架构与您的GPU不匹配。您使用的CUDA版本是什么?你想在什么GPU上运行?(您显示的代码没有问题,CUDA示例的编译方式与您在此处编译的方式不同。)CUDA 11,GPU:Tesla K80。谢谢,我会检查CUDA的错误。我知道我的问题并不局限于某个特定的问题。除非我找出根本原因并切换到编译命令行,否则我将暂时保留我的问题:
-arch=sm_37
如下:nvcc-arch=sm_37 demo.cu
magic!它在包括国旗在内的情况下发挥了作用@罗伯特,介意给个正式的答复吗?也许在你的回答中会有更多的详细说明,尽管它有效,但还是有一个警告。nvcc警告:“compute_35”、“compute_37”、“compute_50”、“sm_35”、“sm_37”和“sm_50”体系结构已被弃用,并可能在将来的版本中删除。任何时候您在使用CUDA代码时遇到问题,最好将其包括在内。我猜您正在使用CUDA11,因此编译的架构与您的GPU不匹配。您使用的CUDA版本是什么?你想在什么GPU上运行?(您显示的代码没有问题,CUDA示例的编译方式与h不同
hello from CPU
bye bye from CPU