https://github.com/jeremysalwen/vectrig
считываю рассчитать высокопараллельные тригонометрические функции (в блоке, например, 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, я не нахожу упоминаний о каких-либо библиотеках или тому подобное.
A. Уже есть что-то?
B. Если нет, совет по оптимизации параллельных функций триггера?
РЕДАКТИРОВАТЬ: я нашел следующую библиотеку под названием «SLEEF»:http://shibatch.sourceforge.net/ который описан вэто бумаги и использует инструкции SIMD для вычисления нескольких элементарных функций. Он использует специфичный для SSE и AVX код, но я не думаю, что будет трудно превратить его в стандартные циклы Си.