CUDA 3.0 版本与编译器选项 -arch=sm_12 的兼容性

Posted

技术标签:

【中文标题】CUDA 3.0 版本与编译器选项 -arch=sm_12 的兼容性【英文标题】:CUDA 3.0 version compatibility with compiler option -arch=sm_12 【发布时间】:2012-04-10 16:38:34 【问题描述】:

我有一个非常简单的 CUDA 程序。使用 -arch=sm_11 选项编译的程序按预期正常工作。但是,当使用 -arch=sm_12 编译时,结果出乎意料。 这是内核代码:

__global__ void dev_test(int *test) 
*test = 100;

我调用内核代码如下:

    int *dev_int, val;
val = 0;
cudaMalloc((void **)&dev_int, sizeof(int));
cudaMemset((void *)dev_int, 0, sizeof(int));
cudaMemcpy(dev_int, &val, sizeof(int), cudaMemcpyHostToDevice);
dev_test <<< 1, 1>>> (dev_int);
int *host_int = (int*)malloc(sizeof(int));
cudaMemcpy(host_int, dev_int, sizeof(int), cudaMemcpyDeviceToHost);
printf("copied back from device %d\n",*host_int);

使用 -arch=sm_11 编译时,打印语句正确打印 100。 然而,当使用 -arch=sm_12 编译时,它会打印 0,即内核函数内部的更改没有生效。我猜这是因为我的 CUDA 版本和 nvidia 驱动程序之间存在一些不兼容问题。

CUDA 版本 - 3.0 NVRM 版本:NVIDIA UNIX x86_64 内核模块 195.36.24 Thu Apr 22 19:10:14 PDT 2010 GCC版本:gcc版本4.4.3(Ubuntu 4.4.3-4ubuntu5)

非常感谢任何帮助。

【问题讨论】:

dev_int 不是悬空指针。我已经使用 cudaMalloc 为其分配了内存。我已经简化了代码来说明我的问题。我基本上想使用 sm_12 以便在 shared 变量上使用 atomicCAS。 我的问题是,在使用 sm_12 时,内核内部发生的任何写入在主机上都不可见。 将指针传递给内核函数并不罕见。这里唯一不寻常的是他的指针指向一个 1 元素数组。我已经在带有 Tesla M2090 的 CUDA 4.1 系统上尝试过这段代码,无论我指定什么 -arch,它都能正常工作。 vinodh 可以升级到 CUDA 4.1 吗? @保罗。我不太明白你。我已经在这里初始化了指针 - cudaMemcpy(dev_int, &amp;val, sizeof(int), cudaMemcpyHostToDevice); 我在所有早期程序中都传递了指针,没有任何问题。它与 arch=sm_11 一起工作的事实表明这不是指针的问题,而是与设备的计算能力有关。 @harrism 感谢您的建议...我确实安装了 4.1.. 但是当我尝试编译时,我收到错误说找不到共享库之一(我认为它是 libcudart4.so .. 我现在不在我的机器旁,因此不知道 lib 的确切名称) 【参考方案1】:

我的问题终于解决了。不确定哪一个真正解决了它——我升级到 Cuda 4.1 并升级了我的 nVidia 驱动程序,两者结合解决了问题。

【讨论】:

以上是关于CUDA 3.0 版本与编译器选项 -arch=sm_12 的兼容性的主要内容,如果未能解决你的问题,请参考以下文章

Tensorflow:Cuda 计算能力 3.0。所需的最低 Cuda 能力为 3.5

.whl文件安装cuda10.0版本的pytorch1.3.0+torchvision0.4.1

为啥 CUDA GPU 只需要 8 个活动 warp?

undefined symbol: __cudaRegisterFatBinaryEnd CUDA编译运行版本不匹配解决

gcc7 的 NVCC 错误

为 CPU 编译 cuda 代码