cuda 6统一内存段错误

标签 cuda

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

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

我的设置是,

  1. 系统:ubuntu 13.10(64位)
  2. 显卡: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 在 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/

相关文章:

c++ - 包含来自 CUDA 10.0 的 npps.h 时发生链接错误

memory - 固定内存 OpenCL,有人成功使用过吗?

variables - 在内核调用之前从 CPU 初始化 GPU 的单个变量

python - Cuda 并行化内核共享计数器变量

c++ - CUDA convolutionFFT2D 示例 - 我看不懂

c++ - 如何动态创建方法来对运行时初始化的类对象进行操作

for-loop - 在 for 循环中重复调用内核的 CUDA 程序的性能受到影响

ubuntu - 如何在 ubuntu 18.1 上安装 cuda-toolkit-10-0?

c - 混合语言CUDA编程

cuda - CUDA的调用图