cudaMemcpy double数组到float数组

时间:2014-12-12 14:45:05

标签: cuda

有没有办法将双数组从Host复制到Device上的float数组。我不关心精度的损失? 我有下一个案例:

double* host = new[N];
... // Perform some calculations on host array

float* device;

cudaMalloc( (void**) &device, N * sizeof(float) );
cudaMemcpy( device, host, N * sizeof(float), cudaMemcpyHostToDevice);

当尝试上面编写的代码时,我得到错误无效的参数。 除了将主机数组更改为float之外,还有解决方法吗?

1 个答案:

答案 0 :(得分:2)

float是4个字节,double是8个字节。您不能简单地memcpy在不兼容的类型之间,您必须先将double转换为float s。

像这样(我冒昧用标准库构造替换原始数组):

std::vector<double> host_double(N); 
// Perform some calculations on host array

// Make a copy of the host vector, converting all doubles to floats
std::vector<float> host_float(host_double.begin(), host_double.end());

// The rest is almost unchanged
float* device;

cudaMalloc((void**)&device, N * sizeof(float));
cudaMemcpy(device, host_float.data(), N * sizeof(float), cudaMemcpyHostToDevice);

但是,您确定从使用double中受益吗?无论如何,所有计算链的最高精度都是float