cuda 11内核无法运行

问题描述

这是demo.cu的目标,旨在从GPU设备中进行打印:

#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;
}

它可以编译并运行:

$ nvcc demo.cu
$ ./a.out

这就是我得到的输出:

hello from CPU
bye bye from CPU

问:为什么GPU没有打印结果?

似乎确实是我错误配置了cuda工具包或其他东西,但是我能够从cuda-samples编译并运行各种程序。例如,matrixMuldeviceQuery

解决方法

CUDA编译器必须针对GPU目标(即设备架构)进行编译。从历史上看,如果您不specify a target architecture,CUDA会选择一种非常灵活的默认体系结构规范,该规范可在CUDA版本支持的所有GPU上运行。

That isn't always the case,但是,CUDA 11并非如此。CUDA11编译为默认架构sm_52(即,就像您在命令行上指定了-arch=sm_52一样) 。但是CUDA 11支持低至sm_35的体系结构。

因此,如果您未在使用CUDA 11的编译命令行上指定目标体系结构,而是尝试在具有sm_52之前的体系结构的GPU上运行,则您已编写的任何CUDA代码(内核)肯定是行不通的。

这是一个很好的习惯,只要您遇到CUDA代码问题,都可以使用proper CUDA error checking,如果您这样做了,那么您将获得运行时错误指示,立即发现了问题(至少对于熟悉CUDA错误的人来说)。

在这些情况下,解决方案是指定一个编译命令,其中包括要在其上运行的GPU(无论如何,这通常都是一种好习惯)。如果这样做,并且指定的体系结构已“弃用”,则nvcc编译器将发出警告,告知您将来的CUDA版本可能不支持您尝试在其上运行的GPU。该警告并不表示您正在做的任何事情是错误的或不合法的,或者需要更改,但这意味着将来,将来的CUDA版本可能不支持该GPU。

如果您不想显示该警告,则可以通过编译命令行上的-Wno-deprecated-gpu-targets开关。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...