c - 使用 SSE/AVX 并行化 C 代码

标签 c x86 sse simd avx

我想使用 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/

相关文章:

c - _mm_movemask_epi8 的内在逆

c - 结构对象数组 - 线程安全

c - 指针和动态数组的大小

c - 如何用一个字符终止我的程序?

assembly - 一条清除PF(奇偶校验标志)的指令——获得结果寄存器中的奇数位

assembly - 无需操作系统即可打印字符串

C 中的条件运算符

c++ - 在汇编文件中调用 C++ 函数

c++ - 将 fpu 异常或 inf 投入工作是否可能/有效?

c++ - 上证4.2 : alternative to _mm_cmpistri