Есть ли функция хоста для преобразования half2 в float2 и наоборот? - PullRequest
0 голосов
/ 24 октября 2018

В графическом процессоре можно легко преобразовать half2 в float2 следующим образом:

float2 float2_value = __half22float2(half2_value);

Также мы можем конвертировать из float2 в half2:

half2 half2_value = __float22half2_rn(float2_value);

Мне было интересно, можно ли выполнять эти операции на процессоре, когда нам нужна проверка или когда нам нужно подготовить данные для отправки их в графический процессор.

Ответы [ 2 ]

0 голосов
/ 25 марта 2019

Я думаю, Роберт сделал не попытался скомпилировать его ответ .Он прав, хотя в официальной документации 1008 * утверждается, что __float22half2 может вызываться хостом.Я столкнулся с той же проблемой, что я не смог этого сделать.Копаясь в источниках, я нахожу

__CUDA_FP16_DECL__ __half2 __float22half2_rn(const float2 f)
{
    __half2 val = __floats2half2_rn(f.x, f.y);
    return val;
}

, где #define __CUDA_FP16_DECL__ static __device__ __inline__.Так что __host__ не найдено, и компилятор жалуется.

Я нашел только один способ:

transform(begin(*kernel), end(*kernel), begin(*k), [](cuFloatComplex const cmplx)
{
    return half2{ half{cmplx.x}, half{cmplx.y} };
});
0 голосов
/ 24 октября 2018

CUDA 10 Справочник по API перечисляет эти функции как __host__ __device__, то есть они могут вызываться из кода хоста:

__host__ ​ __device__ __half2 __float22half2_rn (const float2a) Преобразует оба компонента числа float2 в половину точности в режиме округления до ближайшего четного и возвращает half2 с преобразованными значениями.

__host__ ​ __device__ float2 __half22float2 (const __half2 a) Преобразует обе половины half2 вfloat2 и возвращает результат.

Вот простой тестовый пример:

$ cat t308.cu
#include <cuda_fp16.h>
#include <iostream>

int main(){

  float2 a = make_float2(1.0, 2.0);
  half2 test =  __float22half2_rn ( a );
  a = make_float2(0.0, 0.0);
  std::cout << "a.x =  " << a.x << " a.y = " << a.y << std::endl;
  a = __half22float2( test );
  std::cout << "a.x =  " << a.x << " a.y = " << a.y << std::endl;
}
$ nvcc -o t308 t308.cu
$ ./t308
a.x =  0 a.y = 0
a.x =  1 a.y = 2
$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...