我是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/

10-11 15:13