【问题标题】:Trying to use: cudaHostAllocWriteCombined flag but I'm getting invalid argument when I try cudaMemcpy尝试使用:cudaHostAllocWriteCombined 标志,但是当我尝试 cudaMemcpy 时我得到无效的参数
【发布时间】:2014-07-06 20:00:41
【问题描述】:

首先我想说我真的很喜欢 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 它似乎工作正常,我理解它是如何工作的快速写入慢读,这就是我想使用它的原因。

【问题讨论】:

标签: cuda nvidia memcpy


【解决方案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;
}

【讨论】:

    猜你喜欢
    • 2014-08-28
    • 2022-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多