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 код, но я не думаю, что будет трудно превратить его в стандартные циклы Си.

Ответы на вопрос(5)

Ваш ответ на вопрос