【发布时间】:2014-04-19 04:39:26
【问题描述】:
为了在 CUDA 6 中使用统一内存功能,必须满足以下要求,
- 具有 SM 架构 3.0 或更高版本(Kepler 类或更高版本)的 GPU
- 64 位主机应用程序和操作系统,Android 除外
- Linux 或 Windows
我的设置是,
- 系统:ubuntu 13.10(64 位)
- GPU:GTX770
- CUDA:6.0
- 驱动版本:331.49
示例代码取自编程指南第 210 页。
__device__ __managed__ int ret[1000];
__global__ void AplusB(int a, int b) {
ret[threadIdx.x] = a + b + threadIdx.x;
}
int main() {
AplusB<<< 1, 1000 >>>(10, 100);
cudaDeviceSynchronize();
for(int i=0; i<1000; i++)
printf("%d: A+B = %d\n", i, ret[i]);
return 0;
}
我使用的nvcc编译选项是,
nvcc -m64 -Xptxas=-Werror -arch=compute_30 -code=sm_30 -o UM UnifiedMem.cu
这段代码编译得很好。在执行期间,它在 printf() 处产生“分段错误”。感觉统一内存功能没有生效。变量 ret 的地址仍然是 GPU,但 printf 在 CPU 上被调用。 CPU 试图访问一块未在 CPU 上分配的数据,因此会产生分段错误。有谁能够帮我?这里有什么问题?
【问题讨论】:
-
我不相信 Ubuntu 13.10 是 listed as a supported OS for CUDA 6 RC。此外,每当您遇到 CUDA 代码问题时,最好添加 proper cuda error checking。代码显示时没有错误检查,以清晰沟通,而不是作为最佳实践的演示。我必须添加
#include <stdio.h>才能编译,但它在我的 cc3.5 设备(GTX770 是 cc3.5)上运行良好,在 RHEL 6.2 和 CUDA 6.0RC 上运行。 -
感谢您的建议。我通过使用 cudaMallocManaged() 而不是固定大小的 ret[1000] 对程序做了一个小改动。在我将 CUDA 错误检查插入每个 CUDA 函数调用后,在 cudaMallocManaged() 中发现了问题。它报告“不支持操作”。这是否意味着 CUDA 6 不支持 ubuntu? BTW GTX770 是 cc3.0 设备。
-
是的,我错了,GTX 770 是 cc 3.0。我已经linked the page (
<-click here) 显示了支持哪些操作系统。 CUDA 6 支持 Ubuntu 13.04 和 12.04。我不确定这是否是问题所在,但使用受支持的操作系统可能会更好。
标签: cuda