【发布时间】:2015-06-13 15:51:10
【问题描述】:
我正在尝试创建一个包含uint32_ts 的映射内存文件,然后将其用作零拷贝固定内存,如下所示的 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(...)行覆盖了该值。cudaHostGetDevicePointer不知道如何处理mmap提供的data的新值,因为 CUDA API 没有提供该值。您可以尝试摆脱cudaHostAlloc行,然后在mmap行之后的data上执行cudaHostRegister。我不知道这是否可行。 -
如果 GPU 驱动程序可以从映射文件注册虚拟分配,我会感到非常惊讶
标签: c memory memory-management cuda mmap