1

我已经使用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;
}
4

1 回答 1

3

我无法重现这一点。如果我将您提供的代码片段制作成最小的可执行文件:

#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 安装损坏,要么您的代码在您没有向我们展示的地方出现问题。

也许你可以完全按照我发布的那样编译和运行这段代码,看看会发生什么。如果它有效,它可能有助于缩小这里可能出错的范围。

于 2013-03-25T10:21:54.780 回答