什么';s与cudaMallocHost等效的系统API实现

什么';s与cudaMallocHost等效的系统API实现,cuda,Cuda,嗨,我想分配固定内存,但不使用cudaMallocHost,我已经阅读并尝试使用fixed mmap模拟“cudaMallocHost”: data_mapped_ = (void *)mmap(NULL, sb.st_size, PROT_READ, MAP_SHARED, fd_, 0); if(munmap(data_mapped_, sb.st_size) == -1) { cerr << "munmap failed" << endl; exit

嗨,我想分配固定内存,但不使用cudaMallocHost,我已经阅读并尝试使用fixed mmap模拟“cudaMallocHost”:

data_mapped_ = (void *)mmap(NULL, sb.st_size, PROT_READ, MAP_SHARED, fd_, 0);
if(munmap(data_mapped_, sb.st_size) == -1) {
    cerr << "munmap failed" << endl;
    exit(-1);
}

data_mapped_ = (void *)mmap(data_mapped_, sb.st_size, PROT_READ, MAP_SHARED|MAP_FIXED, fd_, 0);
data\u mapped\u=(void*)mmap(NULL,sb.st\u大小,PROT\u读取,MAP\u共享,fd\u0);
if(munmap(数据映射,sb.st\u大小)=-1){
cerrCUDA固定内存(例如,由
cudaMallocHost
cudaHostAlloc
、或
CUDAHOSTER
)返回的指针)具有几个特征。一个特征是它是不可分页的,并且这个特征主要由底层系统/操作系统调用提供

另一个特点是,它是向CUDA驱动程序注册的。此注册意味着驱动程序跟踪固定分配的起始地址和大小。它使用该信息来准确决定如何处理未来触及该区域的API调用,例如
cudaMemcpy
cudaMemcpyAsync

您可以通过执行自己的系统调用来提供不可分页方面。执行CUDA驱动程序注册功能的唯一方法是实际调用上述CUDA API调用之一


因此,没有一系列纯粹的C库或系统库调用可以完全模拟前面提到的CUDAAPI调用之一的行为,这些调用提供“固定的”内存。< /P> C和C++是不同的语言。你的代码不是C,CUDA不是C++的!@奥拉夫有这个问题吗?如果你要问这个问题,你可能不知道这两种语言至少不够好。我建议你还是用C++ + CUDA。(老实说,没有冒犯!)@Olaf我相信这个问题更多的是关于系统调用,而不是语言本身。没有“固定内存的正确c实现”。必须使用CUDA C/C++函数调用来正确固定内存,以便在CUDA C/C++中使用。这是因为必须让GPU驱动程序知道固定内存。完全使用C库例程或系统例程是不够的。只需“固定”使用C或系统函数调用的内存不会自动触发GPU驱动程序在使用CUDA固定内存时执行的进程,例如,在调用
cudaMemcpy*
时避免额外的内存复制。