我是CUDA新手,我想使用cudaHostAlloc
。我能够将我的问题隔离到下面的代码中。使用malloc
进行主机分配工作,使用cudaHostAlloc
会导致segfault,可能是因为分配的区域无效?当我在两种情况下都转储指针时,它都不是空的,所以cudaHostAlloc
返回一些内容。。。
作品
in_h = (int*) malloc(length*sizeof(int)); //works
for (int i = 0;i<length;i++)
in_h[i]=2;
不起作用
cudaHostAlloc((void**)&in_h,length*sizeof(int),cudaHostAllocDefault);
for (int i = 0;i<length;i++)
in_h[i]=2; //segfaults
独立代码
#include <stdio.h>
void checkDevice()
{
cudaDeviceProp info;
int deviceName;
cudaGetDevice(&deviceName);
cudaGetDeviceProperties(&info,deviceName);
if (!info.deviceOverlap)
{
printf("Compute device can't use streams and should be discarded.");
exit(EXIT_FAILURE);
}
}
int main()
{
checkDevice();
int *in_h;
const int length = 10000;
cudaHostAlloc((void**)&in_h,length*sizeof(int),cudaHostAllocDefault);
printf("segfault comming %d\n",in_h);
for (int i = 0;i<length;i++)
{
in_h[i]=2; // Segfaults here
}
return EXIT_SUCCESS;
}
~
调用
[id129]$ nvcc fun.cu
[id129]$ ./a.out
segfault comming 327641824
Segmentation fault (core dumped)
细节
程序在集群上以交互模式运行。我被告知,从计算节点调用程序会将其推送到集群。没有任何问题与其他国产玩具cuda代码。
编辑
cudaError_t err = cudaHostAlloc((void**)&in_h,length*sizeof(int),cudaHostAllocDefault);
printf("Error status is %s\n",cudaGetErrorString(err));
提供驱动程序错误。。。
Error status is CUDA driver version is insufficient for CUDA runtime version
最佳答案
总是检查错误。很可能cudaHostAlloc
无法分配任何内存。如果失败,您不是在释放,而是在写入未分配的地址空间。当使用malloc
时,它按请求分配内存,并且不会失败。但有时malloc也可能导致失败,因此最好在写入指针之前对其进行检查。
对于未来,最好这样做
int *ptr = NULL;
// Allocate using cudaHostAlloc or malloc
// If using cudaHostAlloc check for success
if (!ptr) ERROR_OUT();
// Write to this memory
编辑(回答问题中的编辑)
错误消息表明您的驱动程序比工具包旧。如果你不想被卡住一段时间,试着下载一个与你的驱动程序兼容的旧版本的cuda工具包。您可以将其安装到您的用户帐户中,并暂时使用其nvcc+库。
关于c - malloc的作品,cudaHostAlloc段错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13594205/