я хотел бы распараллелить свой существующий код с помощью команд SSE/AVX. Я полный нуб в этих инструкциях
Снипер кода, о котором идет речь, следующий
static void inline enc_round(uint32_t b0[4], uint32_t b1[4], const uint32_t **kpp)
{
for (int n = 0; n<4; n++)
{
b0[n] = crypto_ft_tab[0][byte(b1[n], 0)] ^
crypto_ft_tab[1][byte(b1[(n + 1) & 3], 1)] ^
crypto_ft_tab[2][byte(b1[(n + 2) & 3], 2)] ^
crypto_ft_tab[3][byte(b1[(n + 3) & 3], 3)] ^ *(*kpp + n);
}
*kpp += 4;
}
Со следующими определениями типов
const uint32_t crypto_ft_tab[4][256]
static inline uint8_t byte(const uint32_t x, const unsigned n)
Я хотел бы распараллелить логический ANDS
EDIT: извините, я имел в виду побитовое XOR
Любое предложение, как лучше всего начать или с каких команд я должен начать?
заранее спасибо
(n + 1) & 3
? - person Scis   schedule 04.08.2014and
, очевидно, вообще нет). - person Scis   schedule 04.08.2014gather
(хотя сами по себе они не особенно быстры). Или вы можете использовать SSE2pshufb
. 3) Для окончательных XOR вам нужно будет выполнить последовательность перетасовок и XOR на стадии log2 (n) для выполнения этого сокращения. - person Iwillnotexist Idonotexist   schedule 30.10.2014