Я хотел бы перевести этот код, используя встроенные функции SSE.
Я нашел инструкцию pshufb SSSE3 и аналогичную __builtin_ia32_pshufb128(v128i, v128i) GCC внутреннюю, которая может быть использована с этим кодом.
Код переставляет вектор байтов s по индексу k путем замены байтов в массиве определенным образом.
void permutation(int k, std::vector<char> & s)
{
for(size_t j = 1; j < s.size(); ++j)
{
std::swap(s[k % (j + 1)], s[j]);
k = k / (j + 1);
}
}
Я потратил хороший час на размышление о том, как перевести код на pshufb. Можно ли переставить 16-байты с одним pshufb или требуется ли несколько инструкций? Достаточно хорошее решение будет переставлять всего 16 байт.
EDIT: дальнейший контекст проблемы: я повторяю все возможные перестановки s. Вычисление вперед k = 0, 1, 2,... несколько результатов для одного и того же s в порядке. Однако мне нужно воспроизвести k -ую перестановку позже предпочтительно как операцию O (1).