cuda 6统一内存分段故障

时间:2014-03-14 03:40:38

标签: cuda

为了在CUDA 6中使用统一内存功能,必须满足以下要求,

  • 具有SM架构3.0或更高版本的GPU(Kepler类或更新版)
  • 64位主机应用程序和操作系统,Android上除外
  • Linux或Windows

我的设置是,

  1. 系统:ubuntu 13.10(64位)
  2. GPU:GTX770
  3. CUDA:6.0
  4. 驱动程序版本:331.49
  5. 示例代码取自编程指南页面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上分配的数据,因此会产生分段错误。有谁能够帮我?这有什么不对?

1 个答案:

答案 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,但我认为它也应该与最新版本相关。