
[英]When to use cudaHostRegister() and cudaHostAlloc()? What is the meaning of “Pinned or page-locked” memory? Which are the equivalent in OpenCL?
[英]cudaHostRegister fails with 'invalid argument' error even with page-aligned memory
我使用posix_memalign在主机上分配了页面对齐的内存。 对posix_memalign的调用不会返回任何错误。 但是,使用此指针作为cudaHostRegister的参数会给我一个“无效参数”错误。 可能是什么问题?
CUDA API版本:4.0
gcc版本:4.4.5
GPU计算能力:2.0
编辑
内存分配在应用程序代码中完成,指针传递给库例程。
应用程序代码段:
if(posix_memalign((void **)&h_A, getpagesize(), n * n * sizeof(float))) {
printf("Error allocating aligned memory for A\n");
return 1;
}
共享库代码段:
if((ret = cudaSetDeviceFlags(cudaDeviceMapHost)) != cudaSuccess) {
fprintf(stderr, "Error setting device flag: %s\n",
cudaGetErrorString(ret));
return NULL;
}
if((ret = cudaHostRegister(h_A, n2 * sizeof(float),
cudaHostRegisterMapped)) != cudaSuccess) {
fprintf(stderr, "Error registering page-locked memory for A: %s\n",
cudaGetErrorString(ret));
return NULL;
}
我无法重现这一点。 如果我使用您提供的代码片段并将它们转换为最小的可执行文件:
#include <unistd.h>
#include <stdlib.h>
#include <malloc.h>
#include <stdio.h>
int main(void)
{
const int n2 = 100 * 100;
float *h_A;
cudaError_t ret;
if(posix_memalign((void **)&h_A, getpagesize(), n2 * sizeof(float))) {
printf("Error allocating aligned memory for A\n");
return -1;
}
if((ret = cudaSetDeviceFlags(cudaDeviceMapHost)) != cudaSuccess) {
fprintf(stderr, "Error setting device flag: %s\n",
cudaGetErrorString(ret));
return -1;
}
if((ret = cudaHostRegister(h_A, n2 * sizeof(float),
cudaHostRegisterMapped)) != cudaSuccess) {
fprintf(stderr, "Error registering page-locked memory for A: %s\n",
cudaGetErrorString(ret));
return -1;
}
return 0;
}
它在具有304.54驱动程序的64位Linux主机上的CUDA 4.2和CUDA 5.0下编译和运行没有错误。 因此,我会得出结论,要么你有一个破坏的CUDA安装,要么你的代码在你没有向我们展示过的地方有问题。
也许您可以像我发布的那样编译和运行此代码,看看会发生什么。 如果它有效,它可能有助于缩小可能出现问题的范围。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.