Существует ли небольшая матричная библиотека SIMD с двойной точностью для x86?

Я ищу небольшую (4x4) матричную операцию с графикой для SIMD-библиотеки. Там много одиночной точности, но мне нужно поддерживать как единую, так и двойную точность.

Я посмотрел библиотеку Intel IPP MX, но я бы предпочел что-то с источником. Я очень заинтересован в SSE3 + реализациях этих конкретных операций:

  • Mat4 * Mat4
  • Mat4 * Vec4
  • Mat4 * Матрица Mat4
  • Mat4 * Array of Vec4
  • Преобразование Mat4 (приятно иметь)

РЕДАКТИРОВАТЬ: Никакой "преждевременной оптимизации" не отвечает. Любой, кто работал с маленькими матрицами, знает, что GCC не вектурирует их, а также ручную оптимизированную внутренность или ASM. И в этом случае это важно, или я не стал бы спрашивать.

Ответ 1

Возможно, библиотека Eigen?

Он поддерживает команды SSE 2/3/4, ARM NEON и AltiVec.

Ответ 2

Eigen поддерживает матрицы фиксированного размера. Малые матрицы фиксированного размера могут быть выделены на стек для лучшей производительности. 4x4 подходит для SSE, поскольку размер SSE-вектора составляет 128 бит. Строка или столбец из 4 чисел с двойной точностью будет равномерно входить в 2x128 бит SSE-векторов. Это упрощает реализацию SIMD.

Другой вариант - запрограммировать его самостоятельно. Поскольку ваши матрицы малы и вписываются в кеш L1, вам не нужно беспокоиться о титрах памяти, необходимых для больших матриц. Вы можете использовать AVX для повышения производительности. Новые версии GCC и Visual С++ 2010 поддерживают встроенные функции AVX. Размер вектора AVX составляет 256 бит, может содержать ровно 4 номера двойной точности.

Ответ 3

Не полностью завершено, но я хотел передать свою собственную библиотеку - glsl-sse2.

Ответ 4

Здесь реализована реализация 4x4 AVX здесь. Это написано в качестве примера приложения, но я уверен, что было бы нелегко для кого-либо извлечь интересные части в общую библиотеку. Думал, что я опубликую это, несмотря на возраст первоначального вопроса для всех, кто будет здесь в будущем.

Ответ 5

Если вы используете современный компилятор, вам, вероятно, не нужно беспокоиться. Автоматическая векторизация большинства компиляторов должна иметь возможность легко преобразовывать циклы for с фиксированными границами в код SIMD. У GCC это было для довольно долгое время, и это одна из основных точек продажи компилятора Intel (хотя вы должны быть осторожны с использованием компилятора Intel если вы захотите использовать чипы AMD).