Я хочу рассчитать сильно распараллеленные тригг-функции (в блоке 1024), и я хотел бы воспользоваться, по крайней мере, некоторыми из parallelism, которые имеют современные архитектуры.
Когда я компилирую блок
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);
Это имеет смысл для меня. Тем не менее, мне интересно, есть ли библиотека для параллельных вычислений.
С помощью всего лишь простой серии taylor вверх по 11-му порядку GCC будет векторизовать все циклы, и я получаю скорость в два раза быстрее, чем наивный цикл sin (с битовыми точными ответами или с 9-м порядковым номером, только один бит для двух последних из 1600 значений, для ускорения > 3 раза). Я уверен, что кто-то столкнулся с такой проблемой раньше, но когда я google, я не нахожу никаких упоминаний о каких-либо библиотеках и т.п.
а. Есть ли что-то уже существующее? B. Если нет, советы по оптимизации параллельных функций триггера?
EDIT: я нашел следующую библиотеку под названием "SLEEF": http://shibatch.sourceforge.net/, которая описана в этот и использует инструкции SIMD для вычисления нескольких элементарных функций. Он использует специальный код SSE и AVX, но я не думаю, что будет трудно превратить его в стандартные циклы C.