Предположим, я хочу вычислить поднятый косинус. Я мог бы иметь макрос, который делает #define cos_raised(x) (0.5f + 0.5f * cos(x))
, но ради моей проблемы, я хочу, чтобы сделать его функцию, например:Векторизация моей скалярной функции
float cos_raised(float x)
{
return 0.5f + 0.5f * cos(x);
}
Это прекрасно работает, но только с одним входом поплавка, когда он может быть легко vectorised. Как правильно его апроксировать и заставить его принимать float2/3/4/8/16 как вход и выход без дублирования тела функции (это тривиальный пример, но мне нужно знать это для более сложных функций)?
Редактировать: Я думаю, я спрашиваю, как сделать функцию gentype? Просто набрав gentype
, не работает.
Будет ли в вашем ядре одна версия 'cos_raised' или несколько версий, то есть одновременно с версией' float2' и 'float4'? Если всегда будет только одна версия, определив несколько макросов при создании ядра. – chippies
Какие макросы? Идея состоит в том, чтобы иметь одну версию, но работать с этими разными типами. –
Что я имел в виду, скажем, ваше ядро использует только версию 'float cos_raised (floatN x)', но вы не знаете, что такое 'floatN', пока ваша программа не будет запущена. Этот сценарий применим, когда вы векселируете все свои функции для работы с той же шириной вектора, но ширина вектора определяется только во время выполнения. Если это так, вы можете использовать параметр 'options'' clBuildProgram' и передать что-то вроде '' -D floatN = float2''. Таким образом, у вас есть одна версия функции в вашем коде, и она будет работать, с которой когда-либо вводится тип 'floatN'. Достаточно ли этого? – chippies