gpt4 book ai didi

c - 作为不同可能矢量化的函数的运行时间增益

转载 作者:太空宇宙 更新时间:2023-11-04 04:26:37 25 4
gpt4 key购买 nike

我正在用 gcc-4.9 在一个学习矢量化的简单示例上进行测试(我的小代码计算 double 2 个数组的总和并将结果存储到输出数组中) .

从我在网上看到的,似乎存在:

  1. SSE 矢量化(128 位 = 16 字节 = 2*sizeof(double)
  2. AVX 向量化(256 位 = 32 字节 = 4*sizeof(double)
  3. AVX2 向量化(512 位 = 64 字节 = 8*sizeof(double)

我的问题是,在上述三种情况下,我总是获得大约等于 2 的增益(在非矢量化和矢量化版本之间)(平均增益为 1.7)。

我认为我没有使用好的编译选项。这是我所做的:

  1. 对于 SSE :gcc-mp-4.9 -std=c99 -Wa,-q -O3 -march=native -ftree-vectorize -fopt-info-vec main.c

  2. 对于 AVX:gcc-mp-4.9 -std=c99 -Wa,-q -O3 -march=corei7-avx -ftree-vectorize -fopt-info-vec main.c

  3. 对于 AVX2:gcc-mp-4.9 -std=c99 -Wa,-q -O3 -march=core-avx2 -ftree-vectorize -fopt-info-vec main.c

当我运行这 3 个案例时,我总是得到大约 2 的因子,而我希望达到 AVX因子 4AVX2因子 8

我的 MacBook pro 上的处理器是:Intel(R) Core(TM) i7-4960HQ CPU @ 2.60GHz

谁能告诉我激活 AVX 和 AVX2 矢量化的不同标志?

也许,我的 corei7 不支持这些矢量化(只是 SSE?)。

感谢您的帮助。

最佳答案

假设您已经实现了必要的展开和正确的打包调用,那么这里的问题很可能与内存相关:

1) 由于需要更大的内存块来利用更慷慨的包装,因此您将更加努力地使用缓存。

2) 您可能需要在这里告诉编译器您希望数据对齐 32 字节(这将有助于优化)。查找“#pragma vector aligned”,它可能有帮助也可能没有帮助。

3) 如果您的数组大小不是包装的倍数,也可能会有开销 - 所以对于 AVX2 这将是 8 的倍数。一些时间可能会花在“余数”循环中(但这应该是相对较小的开销)。

4) 尝试将优化程度降低到-O2。有时,您告诉编译器负责的越多,代码的效率就越低。

但是您可能会再次遇到较大打包操作的“缓存效率”问题(您可能会从 L1 移动到 L2)。

关于c - 作为不同可能矢量化的函数的运行时间增益,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40848911/

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