为了在CUDA 6中使用统一内存功能,必须满足以下要求,
我的设置是,
示例代码取自编程指南页面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,但是在CPU上调用printf。 CPU正在尝试访问未在CPU上分配的数据,因此会产生分段错误。有谁能够帮我?这有什么不对?
答案 0 :(得分:1)
以为我不确定(我现在无法自己检查)我认为因为Ubuntu 13.10在4.8.1的版本中有gcc
,我认为即使在最新的CUDA Toolkit 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,但我认为它也应该与最新版本相关。