我想使用 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)
我想并行化逻辑与
编辑:抱歉,我的意思是按位异或
有什么建议是最好的启动方式或我应该启动哪些命令吗?
提前致谢
最佳答案
在 GCC 和 Visual Studio 中,您可以轻松地使用编译器内部函数来生成 SSE 和 AVX 指令。
可在英特尔网站上找到可用指令列表:https://software.intel.com/sites/landingpage/IntrinsicsGuide/
使用 SSE2 这看起来像这样:
// load values 1 to 4 as 16 byte blocks from the given addresses:
__m128i value1 = _mm_loadu_((__m128i*)address1);
__m128i value2 = _mm_loadu_((__m128i*)address2);
__m128i value3 = _mm_loadu_((__m128i*)address3);
__m128i value4 = _mm_loadu_((__m128i*)address4);
// build xor
__m128i result = _mm_xor_si128(value1, value2);
result = _mm_xor_si128(result, value3);
result = _mm_xor_si128(result, value4);
// store the result somewhere into memory
_mm_storeu_si128((__m128i*)addressForResult);
请注意,每个 __m128i 变量都包含一个完整的 16 字节数据 vector 。使用 AVX2 内在函数,您甚至可以以 32 字节 block 的形式处理数据。
关于c - 使用 SSE/AVX 并行化 C 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25120021/