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