我是CUDA的新手,我想使用cudaHostAlloc
。我能够将我的问题与以下代码隔离开来。使用malloc
进行主机分配工作时,使用cudaHostAlloc
会导致段错误,可能是因为分配的区域无效?当我在两种情况下转储指针时它都不为空,所以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
答案 0 :(得分:3)
始终检查错误。 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 +库。
答案 1 :(得分:0)
您的segfault不是由对cudaHostAlloc分配的内存块的写入引起的,而是由于尝试“释放”从cudaHostAlloc返回的地址。我能够使用您提供的代码重现您的问题,但是用cudaFreeHost替换免费为我修复了段错误。