首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >运行时作为不同可能的向量化函数的增益

运行时作为不同可能的向量化函数的增益
EN

Stack Overflow用户
提问于 2016-11-28 16:17:34
回答 1查看 48关注 0票数 1

我正在用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周围找到一个因素,而我希望达到factor 4 for AVXfactor 8 for AVX2

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

谁能告诉我不同的标志,主动AVX和AVX2矢量化?

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

谢谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-28 17:11:32

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

1)由于需要更大的内存块来利用更慷慨的打包,您将更难将缓存敲碎。

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

3)如果数组大小不是封装的倍数,也可能存在开销--因此对于AVX2来说,这将是8的倍数。在“剩余”循环中可能会花费一些时间(但这应该是相对较小的开销)。

4)尝试降低-O2的优化程度。有时,越多地告诉编译器来管理代码,代码的效率就会越低。

但是,您可能会遇到更大的打包操作中的“缓存效率”问题(您可能会从L1迁移到L2)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40848911

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档