Векторизованные тригонометрические функции в C?

Я ищу, чтобы вычислить сильно распараллеленные тригонометрические функции (в блоке, как 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 векторизирует все циклы, и я получаю скорости в два раза быстрее, чем наивный цикл sin (с Бит-точными ответами или с серией 9-го порядка, только один бит для последних двух из 1600 значений, для ускорения >3x). Я уверен, что кто-то сталкивался с подобной проблемой раньше, но когда я google, я не нахожу упоминаний о каких-либо библиотеках или тому подобное.

А. Что-то уже существующее?
B. Если нет, Совет по оптимизации параллельной тригонометрии функции?

EDIT: я нашел следующую библиотеку под названием "SLEEF":http://shibatch.sourceforge.net/ который описан в этой бумага и использует инструкции SIMD для вычисления нескольких элементарных функций. Он использует код SSE и AVX, но я не думаю, что будет сложно превратить его в стандартные циклы C.

5 ответов


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

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


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


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

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

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


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