我正在尝试创建一个映射的内存文件,其中包含
uint32_t
,然后将其用作CUDA的零拷贝固定内存,如下所示。我已经分配了空间并从文件中映射了内存,但在获取设备指针时出现了cudaErrorInvalidValue
错误。我知道这个错误消息(来自API)的意思是:
这表明传递给API调用的一个或多个参数不在可接受的值范围内。
但我很难弄清楚为什么会出现这个问题... 有什么想法吗?提前感谢您的帮助。
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
…
int main(void)
{
struct stat buf;
…
uint32_t *data, *dev_data;
cudaDeviceProp cuda_prop;
cudaGetDeviceProperties(&cuda_prop, 0);
if (!cuda_prop.canMapHostMemory)
exit(EXIT_FAILURE);
cudaSetDeviceFlags(cudaDeviceMapHost);
int data_file = open(data_file_name, O_RDONLY);
int stat = fstat(sa_file, &buf);
int data_file_size = buf.st_size;
err = cudaHostAlloc((void**)&data, data_file_size, cudaHostAllocMapped);
if (err == cudaErrorMemoryAllocation) exit(EXIT_FAILURE);
data = (uint32_t*) mmap(0, data_file_size, PROT_READ, MAP_PRIVATE, data_file, 0);
err = cudaHostGetDevicePointer((void**)&dev_data, (void*)data, 0);
if (err == cudaErrorMemoryAllocation)
{
printf("cudaHostGetDevicePointer - Mem Alloc Err\n");
exit(EXIT_FAILURE);
}
else if (err == cudaErrorInvalidValue) //ERROR HERE.
{
printf("cudaHostGetDevicePointer - Invalid Val Err\n");
exit(EXIT_FAILURE);
}
…
}
cudaHostAlloc
为data
分配了一个值,然后您用data = mmap(...)
覆盖了该值。由于该值不是由CUDA API提供的,因此cudaHostGetDevicePointer
不知道如何处理mmap
提供的data
的新值。您可以尝试删除cudaHostAlloc
行,然后在mmap
行之后对data
进行cudaHostRegister
。我不知道那是否有效。 - Robert Crovella