CUDA 6 统一内存分段错误

3
为了使用CUDA 6中的统一内存功能,需要满足以下要求:
  • 具有SM架构3.0或更高版本(Kepler类或更新版本)的GPU
  • 64位主机应用程序和操作系统,除Android外
  • Linux或Windows操作系统
我的设置包括:
  1. 系统:ubuntu 13.10(64位)
  2. GPU:GTX770
  3. CUDA:6.0
  4. 驱动程序版本: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上分配的数据,因此会产生分段错误。有人能帮我吗?这里出了什么问题?

3
我不认为Ubuntu 13.10被列为CUDA 6 RC支持的操作系统。此外,当您遇到CUDA代码问题时,最好添加适当的CUDA错误检查。这段代码没有错误检查是为了更清晰地表达代码,而不是演示最佳实践。我不得不添加#include <stdio.h>才能编译,但在我的cc3.5设备(GTX770为cc3.5)上以及RHEL 6.2和CUDA 6.0RC上都可以正常运行。 - Robert Crovella
1
感谢您的建议。我通过使用cudaMallocManaged()而不是固定大小的ret[1000]对程序进行了小改动。在每个CUDA函数调用中插入CUDA错误检查后,问题被发现在cudaMallocManaged()中。它报告“操作不受支持”。这是否意味着CUDA 6不支持Ubuntu?顺便说一下,GTX770是一个cc3.0设备。 - user3418271
1
是的,我的错误,GTX 770 是cc 3.0。我已经链接了页面<-点击这里),显示支持哪些操作系统。CUDA 6支持Ubuntu 13.04和12.04。我不确定那是否是问题所在,但您可能会在受支持的操作系统上更顺利。 - Robert Crovella
1个回答

1

虽然我不确定(而且现在无法检查),但我认为是因为Ubuntu 13.10中的gcc版本为4.8.1,我相信即使是最新的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的,但我认为它也适用于最新版本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接