Векторизованные тригонометрические функции в 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, похоже, есть несколько вариантов:
-
http://gruntthepeon.free.fr/ssemath/
- для его реализации используются инструкции SSE и SSE2.
-
http://www.gamasutra.com/view/feature/4248/designing_fast_crossplatform_simd_.php
- это альтернативная реализация. Некоторые из комментариев довольно хороший.
тем не менее, я бы, вероятно, заглянул в GPGPU для решения. Возможно, написание его в CUDA или OpenCL (если я правильно помню, CUDA поддерживает функцию синуса). Вот некоторые библиотеки, которые выглядят так, как будто они могут сделать это проще.
Так как вы хотите рассчитать гармоники здесь, у меня есть некоторые код, который решил аналогичную проблему. Он уже векторизован и быстрее, чем все, что я нашел. В качестве побочного преимущества вы получаете Косинус бесплатно.
какую платформу вы используете? Многие библиотеки такого рода уже существуют:
- Intel предоставляет библиотеку векторной математики (VML) с icc.
- Apple предоставляет библиотеку vForce в рамках платформы Accelerate.
- HP предоставляет свою собственную векторную математическую библиотеку для Itanium (и, возможно, других архитектур).
- Sun предоставил libmvec свои инструменты компилятора.
- ...
вместо серии Тейлора я бы посмотрел на алгоритмы, используемые fdlibm. Они должны дать вам столько же точности с меньшим количеством шагов.
мой ответ состоял в том, чтобы создать свою собственную библиотеку, чтобы сделать именно это называется vectrig:https://github.com/jeremysalwen/vectrig