我正在尝试编写一些代码以在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的上限,这将影响以后的计算。我希望有人可以指出正确的方向,或者指出一种更好的方法来进行转换以保持相对的幅度。