如何从Cuda中的双精度数组变为半精度数组?

时间:2019-07-03 18:09:15

标签: c++ cuda floating-point-conversion

我正在尝试编写一些代码以在FP16中进行粗略估计。我目前有一些双精度数组,我想转换为FP16。因此我可以更快地进行一些相对计算,绝对正确性在这里并不重要,但相对量值则很重要。

我有一个基本的转换策略,只需在数组中找到max double,然后将数组中的每个元素除以max,然后将数组中的每个元素乘以FP16 max。我希望这将在我的FP16阵列中保留一些相对幅度,并将对其进行更多计算。

我的转换内核看起来大致是这样

__global__void Double_to_Half(double* input_array, Half2* output_array, double Max_in_array, int array_length){

  int idx = blockIdx.x * blockDim.x + threadIdx.x;

  // ensure we are inside the array
  if(idx < array_length){

    // convert to FP16
    output_array[idx] = (input_array[idx] / Max_in_array) * FP16_MAX;
  }
} 

因为我使用的是FP16_MAX,所以我立即在至少一个单元格中击中FP16的上限,这将影响以后的计算。我希望有人可以指出正确的方向,或者指出一种更好的方法来进行转换以保持相对的幅度。

0 个答案:

没有答案