【问题标题】:CUDA 3.0 version compatibility with compiler option -arch=sm_12CUDA 3.0 版本与编译器选项 -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 的确切名称)

标签: cuda nvidia gpu


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2018-10-07
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    • 2011-10-01
    • 1970-01-01
    • 2017-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多