有没有办法将双数组从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之外,还有解决方法吗?
答案 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
。