【问题标题】:cudaMemcpy double array to float arraycudaMemcpy 双数组到浮点数组
【发布时间】:2014-12-12 23:06:28
【问题描述】:

有没有办法将双数组从主机复制到设备上的浮点数组。我不担心精度损失? 我有下一个案例:

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);

在尝试上面编写的代码时,我收到错误无效参数。 除了将主机数组更改为浮动之外,还有其他解决方案吗?

【问题讨论】:

  • 我不确定你是否理解 memcpy 或 cudaMemcpy 的作用。它在不考虑浮点或双精度的情况下进行字节到字节的二进制复制。因此,即使您运行代码并且没有收到任何错误,设备向量中也会有垃圾。

标签: cuda


【解决方案1】:

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

类似这样的东西(我冒昧地将您的原始数组替换为标准库结构):

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 之一。

【讨论】:

  • 这是一件令人讨厌的事情,但它可能是唯一的方法。我不是,但项目很大,即使浮点精度很好,它也是使用双精度编写的。
猜你喜欢
  • 2014-12-09
  • 2023-03-16
  • 2018-11-13
  • 2011-11-22
  • 1970-01-01
  • 1970-01-01
  • 2015-10-14
  • 2012-04-13
  • 1970-01-01
相关资源
最近更新 更多