malloc公司,cudaHostAlloc公司?

malloc公司,cudaHostAlloc公司?,c,cuda,C,Cuda,我是CUDA新手,我想使用cudaHostAlloc。我能够将我的问题隔离到以下代码中。使用malloc进行主机分配工作,使用cudaHostAlloc会导致SEGFULT,可能是因为分配的区域无效?当我在这两种情况下转储指针时,它都不是空的,因此cudaHostAlloc返回一些东西 工作 详细信息 程序在集群上以交互模式运行。我被告知,从计算节点调用程序会将其推送到集群。没有任何问题与其他国产玩具cuda代码 编辑 cudaError_t err = cudaHostAlloc((void*

我是CUDA新手,我想使用
cudaHostAlloc
。我能够将我的问题隔离到以下代码中。使用
malloc
进行主机分配工作,使用
cudaHostAlloc
会导致SEGFULT,可能是因为分配的区域无效?当我在这两种情况下转储指针时,它都不是空的,因此
cudaHostAlloc
返回一些东西

工作

详细信息

程序在集群上以交互模式运行。我被告知,从计算节点调用程序会将其推送到集群。没有任何问题与其他国产玩具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

您的segfault不是由cudaHostAlloc分配的内存块写入引起的,而是由尝试“释放”cudaHostAlloc返回的地址引起的。我可以使用您提供的代码重现您的问题,但用cudaFreeHost替换free为我修复了segfault


始终检查错误。
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 toolkit的旧版本。您可以将其安装到您的用户帐户中,并暂时使用其nvcc+库。

我刚刚用您的代码构建并测试了一个示例(注释掉malloc行,取消注释cudaHostAlloc行)。这对我来说没有错。我使用
int-length=1000
int*in_h也许您应该创建一个小型复制程序,它是一个完整的可编译应用程序,将它粘贴到您的问题中,然后提供用于编译它的命令行以及系统详细信息,如操作系统、CUDA版本和GPU类型。@RobertCrovella谢谢我发布了代码。我不知道GPU的类型,但我想我测试了它的这种功能…看看cudaHostAlloc(和其他cuda功能)是否返回任何错误。如果失败,则没有分配内存,而且似乎很可能出现SEGFULTS。@Pavan我觉得我没有尝试这样做很愚蠢。我得到以下错误
错误状态为CUDA驱动程序版本不足以支持CUDA运行时版本
。所以我要联系集群管理员。把你的建议作为答案贴出来,这样我就可以给你信用了。谢谢你的建议,但事实上,它早就错了:-)。我将编辑我的帖子以反映这一变化。您是否使用gdb来定位特定的失败点?关于具体哪一次循环SEGFULTS迭代(例如)可能有用的信息。当我在我的卡上测试代码时,一旦我替换了free,它就可以正常运行,所以如果不是这样,那么它可能不容易复制。
[id129]$ nvcc fun.cu 
[id129]$ ./a.out 
segfault comming 327641824
Segmentation fault (core dumped)
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
int *ptr = NULL;
// Allocate using cudaHostAlloc or malloc
// If using cudaHostAlloc check for success 
if (!ptr) ERROR_OUT();
// Write to this memory