Я хотел бы перевести этот код, используя встроенные функции 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).