LINUX.ORG.RU

XOR через AVX на C

 ,


1

1

Всем здравия! В Сях не бум бум вообще, прошу у вас помощи :)

Есть большая переменная на 128 байт для примера (по факту 128MB, но не суть). Нужно каждые её 8 байт XORить со следующими. И желательно с помощью AVX.

uint8_t A[128];
uint64_t X[128/8];
for (int i = 0; i < 128/8; i++)
{
     X[i] = X[i] ^ (uint64_t*)&A[i];
}

Если надо не uint64_t, а другое типа uint256_t (на тип есть библиотека), то будет так?

uint8_t A[128];
uint256_t X[128/32];
for (int i = 0; i < 128/32; i++)
{
     X[i] = X[i] ^ (uint256_t*)&A[i];
}

Как я понимаю этот код будет правильно работать? Можно это сделать через инструкции AVX? Будет быстрее, чем простой xor ^? Указатели, звездочки и амперсанды для меня тёмный лес:) не ругайте строго, просто надо с этим кодом разобраться.


На всякий, справочник по интринсикам. На зеркало, потому что интел - тридварасы. Про выравнивание не забываем, иначе толку ноль.

И да, соглашусь с предыдущим: автовекторизатор компилятора вообще никак? Даже если с опциям/прагмами поиграться?

SkyMaverick ★★★★★
()
Ответ на: комментарий от NotWin

А чем разница posix_memalign или char attribute aligned?

Первое - для динамических аллокаций (проще говоря, malloc c выравниванием). Второе - атрибут выравнивания для типов.

SkyMaverick ★★★★★
()
Последнее исправление: SkyMaverick (всего исправлений: 1)
Ответ на: комментарий от t184256

Указал опции «-Ofast -mfpmath=sse -funroll-loops -fno-inline -fipa-pta -march=broadwell -msse»

После оптимизации алгоритм стал работать на 20% быстрее. Почти как без XOR. Притом на выходе результат одинаковый. Хорошая вещь - автовекторизатор.

Единственно были сомнения, что после оптимизации компилятор выкинет часть кода или сделает по-своему. Но нет, результат одинаков :) Было такое на STM32, чуть ядерную ракету не запустилась сама после оптимизации…:)

NotWin
() автор топика
Ответ на: комментарий от NotWin

Обычно хватает -ftree-vectorize и сборки под 3 архитектуры:

  • -msse4.2 для старья;
  • -march=haswell -mavx2 для middle class;
  • -march=skylake-avx512 для high end.
snizovtsev ★★★★★
()
Последнее исправление: snizovtsev (всего исправлений: 1)
Ответ на: комментарий от snizovtsev

Начиная с GCC 11 и Clang 12 можно можно указывать microarchitecture levels чтобы не было тюнинга под конкретную микроархитектуру, а только общий под доступные расширения.

  • -march=x86-64-v2
  • -march=x86-64-v3
  • -march=x86-64-v4
numas13
()