试图使用:cudaHostAllocWriteCombined标志,但是当我尝试使用cudaMemcpy时,我得到了无效的参数

时间:2014-05-18 23:38:17

标签: cuda nvidia memcpy

首先,我想说我真的很喜欢CUDA文档它真的很棒,足智多谋,虽然我发现很难找到什么版本支持的内容。我正在使用具有计算能力2.0的CUDA驱动程序版本5.0,并且想知道是否支持cudaHostAllocWriteCombined?

在我的代码中:

float *d_data, h_data;
h_data = new float[A];

assert(cudaHostAlloc((void **)&d_data, A * sizeof(float), cudaHostAllocWriteCombined) == cudaSuccess);

cudaError_t err = cudaMemcpy(d_data, h_data, A * sizeof(float), cudaMemcpyHostToDevice);
if (err != cudaSuccess)
{
    std::cout << cudaGetErrorString(err) << std::endl;
    return false;
}

错误返回无效参数,但是如果我使用cudaHostAllocDefault它似乎工作正常,我理解它如何快速写入慢速阅读,这就是为什么我想使用它。

1 个答案:

答案 0 :(得分:1)

您对h_data的使用不正确。 new返回指针,应将其分配给正确的变量类型。在声明中将h_data替换为*h_data,您的代码将或多或少正确,cudaMemcpy不应抛出无效的参数错误。

以下完整代码显示了修正,并在CUDA 6上编译并运行而没有错误:

#include <iostream>
#include <assert.h>
#define A 1024
int main(){

  float *d_data, *h_data;
  h_data = new float[A];

  cudaError_t err = cudaHostAlloc((void **)&d_data, A * sizeof(float), cudaHostAllocWriteCombined);
  if (err != cudaSuccess)
  {
    std::cout << "cudaHostAlloc fail " << std::endl;
    std::cout << cudaGetErrorString(err) << std::endl;
    return 1;
  }

  err = cudaMemcpy(d_data, h_data, A * sizeof(float), cudaMemcpyHostToDevice);
  if (err != cudaSuccess)
  {
    std::cout << "cudaMemcpy fail"  << std::endl;
    std::cout << cudaGetErrorString(err) << std::endl;
    return 1;
  }

  return 0;
}