Я пытаюсь написать код для приблизительной оценки в FP16.В настоящее время у меня есть несколько двойных массивов, которые я хотел бы преобразовать в FP16.поэтому я могу сделать некоторые относительные вычисления быстрее, абсолютная корректность здесь не важна, но относительные величины имеют значение.
У меня есть элементарная тактика преобразования, просто найдите максимальное число в моем массиве, разделите каждый элемент в моем массиве на это максимальное значение и умножьте каждый элемент в моем массиве на максимальное значение FP16.Я надеюсь, что это сохранит некоторые относительные величины в моем массиве 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 по крайней мере в одной ячейке, что позже повлияет на мои вычисления,Я надеюсь, что кто-то может указать мне правильное направление или указать лучший способ сделать преобразование, чтобы сохранить относительные величины.