Векторизованные функции Trig в C?

Я хочу рассчитать сильно распараллеленные тригг-функции (в блоке 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.

Ответ 1

Мой ответ заключался в том, чтобы создать свою собственную библиотеку, чтобы сделать именно это: vectrig: https://github.com/jeremysalwen/vectrig

Ответ 2

Поскольку вы сказали, что используете GCC, похоже, есть несколько вариантов:

Тем не менее, я бы, наверное, посмотрел на GPGPU для решения. Возможно, написав его в CUDA или OpenCL (если я правильно помню, CUDA поддерживает функцию синуса). Вот несколько библиотек, которые выглядят так, как будто они могут сделать это проще.

Ответ 3

Поскольку вы хотите рассчитать гармоники здесь, у меня есть код который адресовал аналогичную проблему. Он векторизован уже и быстрее, чем что-либо еще, что я нашел. В качестве побочного эффекта вы получаете бесплатный косинус.

Ответ 4

Какую платформу вы используете? Многие библиотеки такого типа уже существуют:

  • Intel предоставляет библиотеку векторной математики (VML) с icc.
  • Apple предоставляет библиотеку vForce как часть инфраструктуры Accelerate.
  • HP предоставляет свою собственную библиотеку векторных математиков для Itanium (и может также использовать другие архитектуры).
  • Sun предоставил libmvec свои инструменты компиляции.
  • ...

Ответ 5

Вместо ряда Тейлора я бы рассмотрел алгоритмы использования fdlibm. Они должны получить столько же точности с меньшим количеством шагов.