【问题标题】:cuda 6 unified memory segmentation faultcuda 6统一内存分段错误
【发布时间】:2014-04-19 04:39:26
【问题描述】:

为了在 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 上分配的数据,因此会产生分段错误。有谁能够帮我?这里有什么问题?

【问题讨论】:

  • 我不相信 Ubuntu 13.10 是 listed as a supported OS for CUDA 6 RC。此外,每当您遇到 CUDA 代码问题时,最好添加 proper cuda error checking。代码显示时没有错误检查,以清晰沟通,而不是作为最佳实践的演示。我必须添加#include &lt;stdio.h&gt; 才能编译,但它在我的 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 (&lt;-click here) 显示了支持哪些操作系统。 CUDA 6 支持 Ubuntu 13.04 和 12.04。我不确定这是否是问题所在,但使用受支持的操作系统可能会更好。

标签: cuda


【解决方案1】:

以为我不确定(我现在不能自己检查)我认为这是因为 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,但我认为它也应该与最新版本相关。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-01
    • 2013-05-15
    • 1970-01-01
    • 2020-06-01
    • 2016-12-18
    • 1970-01-01
    • 2017-07-06
    相关资源
    最近更新 更多