我可以访问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
问题 - 我做错了什么?
答案 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
变量。