gpt4 book ai didi

c - 如何使用 GCC 自动矢量化跨步写入?

转载 作者:太空狗 更新时间:2023-10-29 17:26:01 25 4
gpt4 key购买 nike

当使用 -std=c99-O3-mavx2 使用 GCC 5.2 编译时,以下代码示例自动矢量化 ( assembly here ):

#include <stdint.h>

void test(uint32_t *restrict a,
uint32_t *restrict b) {
uint32_t *a_aligned = __builtin_assume_aligned(a, 32);
uint32_t *b_aligned = __builtin_assume_aligned(b, 32);

for (int i = 0; i < (1L << 10); i += 2) {
a_aligned[i] = 42 * b_aligned[i];
a_aligned[i+1] = 3 * a_aligned[i+1];
}
}

但以下代码示例不会自动矢量化 (assembly here):

#include <stdint.h>

void test(uint32_t *restrict a,
uint32_t *restrict b) {
uint32_t *a_aligned = __builtin_assume_aligned(a, 32);
uint32_t *b_aligned = __builtin_assume_aligned(b, 32);

for (int i = 0; i < (1L << 10); i += 2) {
a_aligned[i] = 42 * b_aligned[i];
a_aligned[i+1] = a_aligned[i+1];
}
}

样本之间的唯一区别是 a_aligned[i+1] 的比例因子。

GCC 4.8、4.9 和 5.1 也是如此。将 volatile 添加到 a_aligned 的声明中可以完全禁止自动矢量化。对我们来说,第一个示例始终比第二个示例运行得更快,对于较小的类型(例如 uint8_t 而不是 uint32_t)的加速更明显。

有没有办法让第二个代码示例使用 GCC 自动矢量化?

最佳答案

下面的版本是矢量化的,但如果你问我那是丑陋的......

#include <stdint.h>

void test(uint32_t *a, uint32_t *aa,
uint32_t *restrict b) {
#pragma omp simd aligned(a,aa,b:32)
for (int i = 0; i < (1L << 10); i += 2) {
a[i] = 2 * b[i];
a[i+1] = aa[i+1];
}
}

-fopenmp编译,用test(a, a, b)调用。

关于c - 如何使用 GCC 自动矢量化跨步写入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33192739/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com