【发布时间】: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, &val, sizeof(int), cudaMemcpyHostToDevice);我在所有早期程序中都传递了指针,没有任何问题。它与 arch=sm_11 一起工作的事实表明这不是指针的问题,而是与设备的计算能力有关。 -
@harrism 感谢您的建议...我确实安装了 4.1.. 但是当我尝试编译时,我收到错误说找不到共享库之一(我认为它是 libcudart4.so .. 我现在不在我的机器旁,因此不知道 lib 的确切名称)