Как исправить математические функции, которые не были найдены в cuda_fp16.h

Я пишу программу вычислений CUDA с большим объемом памяти. Мне нужно использовать математические функции, такие как в math.h в моем ядре. Итак, я провел небольшое исследование и наткнулся на «cuda_fp16.h», который должен добавить множество математических функций для использования на устройстве. Однако, если я хочу использовать одну из этих математических функций (например, cos(i), которая является частью этой библиотеки), при компиляции мне сообщается, что я не могу запустить функцию __host__ на устройстве. Мне ясно, что это невозможно, но библиотека cuda_fp16.h точно должна добавить __device__ функций для математики. В «cuda_fp16.h» есть ошибки, говорящие о том, что тип __half не определен.

Я просмотрел определение cos(), которое использовал, и оно привело меня к чему-то внутри math.h. Так что я предполагаю, что он просто берет функцию оттуда вместо cuda_fp16.h


#include "cuda.h"
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include "cuda_fp16.h"

__global__ void computation(double x, double y) //function that should upon being called compute the cosine of y.
{
    x = cos(y);
}

Это очень простой пример того, что я пытаюсь сделать; просто чтобы заставить ядро ​​​​вычислить какую-то математическую функцию значения.

Я ожидаю, что все это сможет скомпилироваться, поскольку я включил библиотеку, которая позволила бы вычислить такую ​​​​функцию с помощью функции __device__. Однако он не компилируется и сообщает мне, что я не могу вызвать функцию __host__ cos на устройстве.


person Niels Slotboom    schedule 07.08.2019    source источник
comment
Почему x и y относятся к типу double?   -  person BlameTheBits    schedule 07.08.2019
comment
cuda_fp16.h — это включаемый файл, специально предназначенный для операций с плавающей запятой половинной точности. Как вы думаете, почему это будет применимо в вашем примере?   -  person talonmies    schedule 07.08.2019
comment
Я не уверен насчет CUDA, но я думаю, что он следует тем же правилам передачи по значению, что и, например. C, что означает, что присваивание x не принесет ничего полезного.   -  person Some programmer dude    schedule 07.08.2019
comment
@Shadow Мне нужна двойная точность   -  person Niels Slotboom    schedule 07.08.2019
comment
@talonmies Как мне тогда вычислять с двойной точностью?   -  person Niels Slotboom    schedule 07.08.2019
comment
Вдобавок ко всему остальному явно неправильно, код в вашем вопросе компилируется без ошибок для меня. Исправлять нечего -- pastebin.com/QQXYT1Bt   -  person talonmies    schedule 07.08.2019
comment
@Someprogrammerdude, проблема в том, что функция __host__ вызывается с устройства, это ничего не говорит мне о том, что она выражена неправильно.   -  person Niels Slotboom    schedule 07.08.2019
comment
@talonmies, так что он не говорит вам, что вы вызываете функцию __host__ с устройства? Я думаю, что для меня это вызывает функцию cos() из math.h   -  person Niels Slotboom    schedule 07.08.2019


Ответы (1)


Я нашел проблему. В самом коде у меня был int вместо double в качестве аргумента функции. Если аргументом для cos() является int, то используется версия функции <math.h> вместо версии CUDA. CUDA вызывается с float и double. Таким образом, код, который я разместил в качестве примера, показывает, как он на самом деле должен работать, я просто не понял, что я дал целое число в качестве аргумента вместо фактического желаемого двойного числа.

person Niels Slotboom    schedule 07.08.2019