CUDA 11内核不运行 [英] cuda 11 kernel doesn't run

查看:70
本文介绍了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编译和运行各种程序。例如,matrixMuldeviceQuery

推荐答案

如果您的设备具有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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆