Как перейти от двойного массива в Cuda к массиву половинной точности? - PullRequest
1 голос
/ 03 июля 2019

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

...