CudahosterRegister与';无效参数';即使使用页对齐内存也会出错

CudahosterRegister与';无效参数';即使使用页对齐内存也会出错,cuda,Cuda,我已经使用posix_memalign在主机上分配了页对齐内存。调用posix_memalign不会返回任何错误。但是,使用此指针作为CudahosterRegister的参数会给我一个“无效参数”错误。可能是什么问题 CUDA API版本:4.0 gcc版本:4.4.5 GPU计算能力:2.0 编辑 内存分配在应用程序代码中完成,并将指针传递给库例程 应用程序代码段: if(posix_memalign((void **)&h_A, getpagesize(), n * n * s

我已经使用posix_memalign在主机上分配了页对齐内存。调用posix_memalign不会返回任何错误。但是,使用此指针作为CudahosterRegister的参数会给我一个“无效参数”错误。可能是什么问题

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;
  }
共享库代码段:

  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;
}
#包括
#包括
#包括
#包括
内部主(空)
{
常数int n2=100*100;
浮动*h_A;
cudaError_t ret;
if(posix_memalign((void**)和h_A,getpagesize(),n2*sizeof(float))){
printf(“为A分配对齐内存时出错”);
返回-1;
}
if((ret=cudaSetDeviceFlags(cudaDeviceMapHost))!=cudaSuccess){
fprintf(标准,“错误设置设备标志:%s\n”,
cudaGetErrorString(ret));
返回-1;
}
如果((ret=cudaHostRegister)(h_A,n2*sizeof(浮动),
cudahosterregistermapped)!=cudaSuccess){
fprintf(stderr,“为%s注册页面锁定内存时出错”,
cudaGetErrorString(ret));
返回-1;
}
返回0;
}
它在CUDA 4.2和CUDA 5.0下,在64位linux主机上,使用304.54驱动程序编译和运行,没有错误。因此,我会得出结论,要么你的CUDA安装坏了,要么你的代码在你没有展示给我们的地方出了问题


也许你可以像我发布的那样编译和运行这段代码,看看会发生什么。如果它有效,可能有助于缩小这里可能出现的问题。

考虑升级到cuda 5,看看问题是否得到解决。如果您使用普通的
malloc()
而不是
posix_memalign()
,会发生什么情况?然后您是否能够成功注册内存?一些说明问题的代码将非常有用,谢谢您的回答@RobertCrovella:最初我尝试使用
malloc()
,但这会产生一个“无效参数”错误。这时我读到了未对齐内存可能出现的问题,并尝试使用
posix_memalign()
。升级到CUDA 5现在不是我的选择,因为这是我正在使用的共享服务器@Talonmes:我已经发布了我的问题的编辑代码。作为另一个数据点,我也在cuda 4.1上用285.05.33驱动程序运行了Talonmes代码(我必须
#include
),它运行时没有出错。@RobertCrovella:有趣的是,我没有因为缺少
stdio.h
(这是带有gcc 4.6的Ubuntu 12.04),这有点奇怪。我已经相应地编辑了代码