автоматическая векторизация с индексом по модулю?

Я пытаюсь заставить clang ++ автоматически векторизовать простой цикл шифрования битов, который делает что-то вроде этого:

for(int i = 0; i < sz; ++i) {
dst[i] = src[i] ^ key[i]
}

если dst, src а также key одинаковой длины, у компилятора нет проблем с векторизацией этого цикла, но я действительно хочу сделать следующее:

for(int i = 0; i < sz; ++i) {
dst[i] = src[i] ^ key[i % 64];
}

Мне не нужен ключ, чтобы быть так долго, как данные, но когда я добавляю % 64 векторизатор убегает, и я остаюсь с нормальной петлей. Это происходит даже с % 8 который является размером регистров SIMD. Следующее, что я попробовал, было так:

char d = 0x80
for(int i = 0; i < sz; ++i) {
dst[i] = src[i] ^ d;
++d;
}

но векторизатору это тоже не понравилось.
Делая это однако:

for(int i = 0; i < sz; ++i) {
dst[i] = src[i] ^ 0x80;
++d;
}

действительно векторизовался нормально, но наличие ключа всего в один байт короче, чем я надеялся.

Есть ли способ сделать что-то подобное так, чтобы доставить удовольствие векторизатору?

0

Решение

Я могу воспроизвести это с помощью Apple (XCode) лязг. Использование блоков по модулю 64, кажется, удовлетворяет векторизатор:

int i = 0; /* current index. */

int szd = sz / 64;
int szm = sz % 64;
for (int j = 0; j < szd; j++)
{
for (int k = 0; k < 64; i++, k++)
dst[i] = src[i] ^ key[k];
}

for (int k = 0; k < szm; i++, k++)
dst[i] = src[i] ^ key[k];
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]