Вопрос

кто-нибудь может порекомендовать портативную библиотеку SIMD, которая предоставляет c / c ++ API, работает с расширениями Intel и AMD и Visual Studio, совместимыми с GCC.Я хочу ускорить такие вещи, как масштабирование массива удвоений размером 512x512.Векторные точечные произведения, матричное умножение и т.д.

Пока единственное, что я нашел, это:http://simdx86.sourceforge.net/ но, как сказано на самой первой странице, он не компилируется в visual studio.

Есть также Intel IPP, который, насколько я понимаю, не работает на AMD.И есть Framewave от AMD, но у меня возникли некоторые проблемы с компиляцией и связыванием их библиотеки, а их форумы полностью отключены.Кому-нибудь удалось где-нибудь использовать Framewave?

Спасибо.

Это было полезно?

Решение

Поскольку вы упомянули высокоуровневые операции с матрицами и векторами, АТЛАС, MKL от Intel, ПЛАЗМА, и ПЛАМЯ может представлять интерес.

Некоторые матричные математические библиотеки C ++ включают UBLAS от Boost, Armadillo, Eigen, IT ++ и Newmat.Библиотека POOMA, вероятно, также включает в себя некоторые из этих вещей. Этот вопрос также относится к MTL.

Если вы ищете примитивы переносимости более низкого уровня, мой коллега разработал оболочку для векторных операций SSE2, Altivec, VSX, Larrabee и Cell SPE.Это можно найти в нашем исходный репозиторий, но его лицензирование (академическое) может оказаться неподходящим, если вы хотите распространять его как часть своей работы.Он также все еще находится в стадии значительной разработки, чтобы покрыть диапазон потребностей приложений, на которые он ориентирован.

Другие советы

Eigen является MPL2-лицензированная библиотека C ++ только для заголовков, содержащая векторную / матричную математику, оптимизированную для SSE, Neon и Altivec.У них есть более сложные математические операции в их дополнительных модулях.

Ознакомьтесь с macstl: http://www.pixelglow.com/macstl/

Попробуй кипяток или связанный с этим ОРК.Особенно интересен орк;он реализует высокоуровневый язык ассемблера, который компилируется в код, специфичный для конкретной архитектуры.Довольно сложный, гораздо более сложный, чем простая библиотека-оболочка.

Если вы не возражаете поработать с ассемблером, то вы всегда можете использовать встроенные функции для всех инструкций SIMD.Они будут зависеть от конкретного процессора, т. е.Встроенные функции SSE4 будут работать только на процессорах с поддержкой SSE4, и вам решать, есть ли расширения.

Есть хорошая статья здесь о применении SIMD.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top