Векторизованные функции Trig в C? - PullRequest
8 голосов
/ 24 февраля 2011

Я рассчитываю рассчитать высокопараллельные триггерные функции (в блоке, например, 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, я не нахожу упоминаний о каких-либо библиотеках или тому подобном.Есть ли что-то уже существующее?
B. Если нет, совет по оптимизации параллельных функций триггера?

РЕДАКТИРОВАТЬ: Я нашел следующую библиотеку под названием "SLEEF": http://shibatch.sourceforge.net/, которая описана в это бумага и использует инструкции SIMD для вычисления нескольких элементарных функций.Он использует специфичный для SSE и AVX код, но я не думаю, что будет трудно превратить его в стандартные циклы C.

Ответы [ 5 ]

4 голосов
/ 24 февраля 2011

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

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

2 голосов
/ 24 февраля 2011

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

1 голос
/ 25 февраля 2011

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

1 голос
/ 24 февраля 2011

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

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

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

...