cuda 11 内核没有 运行
cuda 11 kernel doesn't run
这里有一个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;
}
编译并 运行s:
$ nvcc demo.cu
$ ./a.out
这是我得到的输出:
hello from CPU
bye bye from CPU
问:为什么GPU没有打印结果?
似乎我错误地配置了 cuda 工具包或其他东西,但是我能够编译 运行 来自 cuda 示例的各种程序。例如,matrixMul, or deviceQuery
如果您的设备具有 3.0 或更低的计算能力,CUDA 11 将放弃对这些 GPU 的支持。您需要使用 .
CUDA 编译器必须针对 GPU 目标(即设备架构)进行编译。如果你不在编译命令行上,历史上,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 代码时遇到问题,都可以使用 proper CUDA error checking,如果您在此处这样做,您将获得运行可以立即识别问题的时间错误指示(至少对于熟悉 CUDA 错误的人来说是这样)。
这些情况下的解决方案是指定一个编译命令,其中包含您打算 运行 使用的 GPU(无论如何,这通常是一种很好的做法)。如果您这样做,并且您指定的体系结构“已弃用”,那么 nvcc
编译器将发出警告,让您知道未来的 CUDA 版本可能不支持您尝试 运行 的 GPU .该警告并不意味着您所做的任何事情都是错误的、非法的或需要更改的,而是意味着将来的 CUDA 版本可能不支持该 GPU。
如果你想抑制那个警告,你可以通过编译命令行上的-Wno-deprecated-gpu-targets
开关。
当然,windows 也会出现同样的问题。在这种情况下,您需要修改以下 VS 项目设置以匹配您设备的体系结构:
这里有一个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;
}
编译并 运行s:
$ nvcc demo.cu
$ ./a.out
这是我得到的输出:
hello from CPU
bye bye from CPU
问:为什么GPU没有打印结果?
似乎我错误地配置了 cuda 工具包或其他东西,但是我能够编译 运行 来自 cuda 示例的各种程序。例如,matrixMul, or deviceQuery
如果您的设备具有 3.0 或更低的计算能力,CUDA 11 将放弃对这些 GPU 的支持。您需要使用
CUDA 编译器必须针对 GPU 目标(即设备架构)进行编译。如果你不在编译命令行上
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(无论如何,这通常是一种很好的做法)。如果您这样做,并且您指定的体系结构“已弃用”,那么 nvcc
编译器将发出警告,让您知道未来的 CUDA 版本可能不支持您尝试 运行 的 GPU .该警告并不意味着您所做的任何事情都是错误的、非法的或需要更改的,而是意味着将来的 CUDA 版本可能不支持该 GPU。
如果你想抑制那个警告,你可以通过编译命令行上的-Wno-deprecated-gpu-targets
开关。
当然,windows 也会出现同样的问题。在这种情况下,您需要修改以下 VS 项目设置以匹配您设备的体系结构: