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

Ale*_*mov 0 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;
}
Run Code Online (Sandbox Code Playgroud)

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

分段错误:11

问题 - 我做错了什么?

Rob*_*lla 10

无论何时遇到cuda代码问题,都应该始终实施正确的cuda错误检查

如果您这样做,我很确定您会看到错误"操作不受支持"作为您cudaMallocManaged通话的返回代码.

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

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变量.