CUDA 6:最简单的样本分割错误

时间:2014-02-15 12:32:15

标签: memory cuda

我可以访问CUDA 6 RC作为注册开发人员,我想尝试使用CUDA 6的新功能:统一内存。所以,当我尝试使用此功能时,我创建了一个简单的示例: 这是我的例子:

#include <stdio.h>
#include <cuda_runtime.h>

int
main(void)
{
    int numElements = 5000;
    size_t size = numElements * sizeof(float);
    float *a;
    cudaMallocManaged(&a, numElements);

    for (int i = 0; i < numElements; ++i)
     {
         a[i] = rand()/(float)RAND_MAX;
    }


    return 0;
}

我试过运行它的例子,但我得到了分段错误错误:

  

分段错误:11

问题 - 我做错了什么?

1 个答案:

答案 0 :(得分:10)

每当您遇到cuda代码时遇到问题,都应该始终实施proper cuda error checking

如果您这样做,我很确定您会看到错误&#34;操作不受支持&#34;作为cudaMallocManaged来电的返回代码。

统一内存支持仅在 Kepler GPU上可用(此时)。请参阅附录J&#34;统一存储器编程&#34;在CUDA_C_Programming_Guide.pdf文档中,该文档将位于标准Linux安装的/usr/local/cuda/doc/pdf目录中:

  

J.1.4。系统要求

     

统一内存有三个基本要求:

     

•具有SM架构3.0或更高版本的GPU(Kepler类或更新版)

     

•64位主机应用程序和操作系统,Android上除外

     

•Linux或Windows

因此,如果您尚未使用Kepler GPU,请使用64位Linux或Windows(即非MacOS),并确保使用指定的适当Kepler架构编译代码,例如: -arch=sm_30

由于您的cudaMallocManaged调用失败,a指针永远不会被设置,任何后续操作都会导致seg错误。

正如@talonmies指出的那样,将您的分配大小从numElements更改为计算出的size变量。