【发布时间】:2019-10-25 07:28:25
【问题描述】:
当使用不同的计算能力编译时,此代码的工作方式不同:
#include <cuda.h>
#include <stdio.h>
__managed__ int m;
int main() {
printf("hi 1\n");
m = -123;
printf("hi 2\n");
}
计算能力 6.0 的设备:
$ nvcc main.cu -gencode arch=compute_60,code=sm_60 -rdc=true && ./a.out
hi 1
hi 2
计算能力 7.0 的设备:
$ nvcc main.cu -gencode arch=compute_60,code=sm_60 -rdc=true && ./a.out
hi 1
Segmentation fault
计算能力 7.0 的设备:
$ nvcc main.cu -gencode arch=compute_70,code=sm_70 -rdc=true && ./a.out
hi 1
hi 2
为什么在使用计算能力 6.0 构建并在计算能力 7.0 的 GPU 上运行时出现分段错误?
【问题讨论】:
-
因为不支持?并非所有计算能力都支持所有功能。事实上,这是了解您的计算能力很重要的唯一原因!
-
@AnderBiguri 根据 CUDA 文档,从计算能力 6.0 开始支持统一内存。我提到它实际上适用于具有计算能力 6.0 的 GPU。问题是:当我为计算能力 6.0 编译二进制文件时,它在支持计算能力 7.0 的 GPU 上不起作用。
-
我不确定。在我的工具中,如果运行 CUDA 代码为旧版
cc编译,我通常会得到“没有可在设备上执行的内核映像”,即使只是以前的版本。你可能没有得到它,因为你没有内核 -
每个 CUDA 安装都对使用不正确的计算能力保持沉默,除非您 explicitly check for errors。
-
仔细阅读链接的答案,因为内核启动的错误检查有点古怪。您需要在调用
cudaDeviceSynchronize()之前检查cudaPeekAtLastError()或cudaGetLastError()的返回值以检查此类启动错误,否则错误会在您注意到它之前被重置。
标签: cuda