cudaHostRegister返回cudaErrorInvalidValue

时间:2018-12-05 10:14:42

标签: cuda mmap memory-mapped-files

我已经以READONLY模式打开了一个文件。使用mmap将其映射到主机内存中,如下所示

uint8_t *data_ptr = (uint8_t *) mmap(NULL,NumOfBytes,PROT_READ,MAP_PRIVATE, file_descriptor, 0);

mmap返回,没有错误。

现在,我想使用cudaHostRegister锁定内存,以便可以在cuda API cudaMemcpyAsync(..)

中使用 data_ptr
cudaHostRegister(data_ptr,NumOfBytes,cudaHostRegisterDefault);

cudaHostRegister返回错误,即cudaErrorInvalidValue

cudaErrorInvalidValue的描述如下:

  

这表示已将一个或多个参数传递给API   通话不在可接受的值范围内

有人知道为什么以上功能会抱怨吗?

编辑1:

mmap不返回映射文件的物理位置,因此我使用了两个指针。一个用于malloc,另一个用于映射文件。

/* This ptr will hold the physical location of the file */
    ptr = malloc(size)

/* Virtual address of mapped file */
    tmp_ptr = mmap(file)

/* Copy the contents of file to the ptr */
    memcpy(ptr,tmp_ptr,size)

/* unmapping the file */
    munmap(tmp_ptr,..)

/* Register the ptr */
    cudaHostRegister(ptr,size,..)

此技术有效,但是此方法存在两个问题。

1)memcpy花一些时间处理大文件。

2)memcpy对于约4GB的文件失败(分段错误)。

尽管我有大约10GB的可用内存空间。

1 个答案:

答案 0 :(得分:1)

对我有用的方法如下:

1)使用mmap

映射了文件

2)使用mlock

将其固定

3)使用cudaHostRegister

注册了它