我已经以READONLY模式打开了一个文件。使用mmap
将其映射到主机内存中,如下所示
uint8_t *data_ptr = (uint8_t *) mmap(NULL,NumOfBytes,PROT_READ,MAP_PRIVATE, file_descriptor, 0);
mmap返回,没有错误。
现在,我想使用cudaHostRegister
锁定内存,以便可以在cuda API cudaMemcpyAsync
(..)
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的可用内存空间。
答案 0 :(得分:1)
对我有用的方法如下:
1)使用mmap
2)使用mlock
3)使用cudaHostRegister