Я рассчитываю рассчитать высокопараллельные триггерные функции (в блоке, например, 1024), и я хотел бы воспользоваться хотя бы некоторыми из параллелизма, который есть в современных архитектурах.
Когда я компилируюблок
for(int i=0; i<SIZE; i++) {
arr[i]=sin((float)i/1024);
}
GCC не будет его векторизовать и говорит:
not vectorized: relevant stmt not supported: D.3068_39 = __builtin_sinf (D.3069_38);
Что имеет смысл для меня.Тем не менее, мне интересно, есть ли библиотека для параллельных вычислений триггеров.
С помощью простого ряда Тейлора до 11-го порядка, GCC будет векторизовать все циклы, и я получаю скорости в два раза быстреекак цикл наивного греха (с точными битовыми ответами или с сериями 9-го порядка, только один бит отключен для последних двух из 1600 значений, для ускорения> 3x).Я уверен, что кто-то сталкивался с подобной проблемой раньше, но когда я в Google, я не нахожу упоминаний о каких-либо библиотеках или тому подобном.Есть ли что-то уже существующее?
B. Если нет, совет по оптимизации параллельных функций триггера?
РЕДАКТИРОВАТЬ: Я нашел следующую библиотеку под названием "SLEEF": http://shibatch.sourceforge.net/, которая описана в это бумага и использует инструкции SIMD для вычисления нескольких элементарных функций.Он использует специфичный для SSE и AVX код, но я не думаю, что будет трудно превратить его в стандартные циклы C.