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