要在 CUDA 6 中使用统一内存功能,必须满足以下要求,
- 具有 SM 架构 3.0 或更高版本(开普勒级或更高版本)的 GPU
- 64 位主机应用程序和操作系统,Android 除外
- Linux 或 Windows
我的设置是,
- 系统:ubuntu 13.10(64位)
- 显卡: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 在 4.8.1 版本中有 gcc
,我认为它不受支持但即使在最新的 CUDA 工具包 6.0 中。尝试使用主机编译器 gcc
4.7.3 编译您的代码(即默认包含在官方支持的 Ubuntu 13.04 中的同一编译器)。为此,您可以安装 gcc-4.7
打包并指向 /usr/bin/gcc-4.7
作为 nvcc
的主机编译器。对于 C++ 支持,我相信你需要 g++-4.7
如果您需要一些简单的分步指南,那么您可以继续 http://n00bsys0p.co.uk/blog/2014/01/23/nvidia-cuda-55ubuntu-1310-saucy-salamander .它适用于 CUDA Toolkit 5.5,但我认为它也应该与最新版本相关。
关于cuda 6统一内存段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22395678/