繁体   English   中英

AVX-512中的1-to-4广播和4-to-1压缩

1-to-4 broadcast and 4-to-1 reduce in AVX-512

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我需要执行以下两项操作:

float x[4];
float y[16];

// 1-to-4 broadcast
for ( int i = 0; i < 16; ++i )
    y[i] = x[i / 4];

// 4-to-1 reduce-add
for ( int i = 0; i < 16; ++i )
    x[i / 4] += y[i];

什么是有效的AVX-512实现?

1 个回复

对于reduce-add,只需进行vmovshdup改组并添加( vmovshdup / vaddps / vpermilps imm8 / vaddps ),就像在x86上进行水平浮点矢量和的最快方法一样, 在每个128位通道中获取水平和,然后vpermps将所需的元素vpermps到底部。 或使用带有恒定掩码的vcompressps做相同的事情,还可以选择使用内存目标。

打包成单个向量后,您将拥有一个普通的SIMD 128位加法。

如果您的数组实际上大于16,则可以使用vpermt2ps而不是vpermps从两个源向量中的每一个获取第4个元素,从而将+=部分用于x[] 256位向量。 (或者再次与另一个改组合并为512位向量,但这可能会成为SKX上改组吞吐量的瓶颈)。

在SKX上, vpermt2ps仅为单个uop,吞吐量为1c /延迟为3c,因此对于其强大功能而言非常有效。 在KNL上,它的吞吐量为2c,比vpermps差,但也许仍然值得。 (KNL没有AVX512VL,但是如果需要,您(或编译器)可以将256位向量添加到x[] ,然后使用AVX1 vaddps ymm 。)

有关说明表,请参见https://agner.org/optimize/


对于负载:

这是在循环内完成还是反复进行? (即,您可以将随机控制向量保存在寄存器中吗?如果可以,则可以

  • 使用VBROADCASTF32X4 (用于加载端口的单个VBROADCASTF32X4执行128-> 512广播。
  • vpermilps zmm,zmm,zmm进行车道内混洗vpermilps zmm,zmm,zmm以在每个128位通道中广播不同的元素。 (必须与广播负载分开,因为内存源vpermilps可以具有m512m32bcst源。(指令通常具有其内存广播粒度=元素大小,不幸的是,在某些情况下,这样的情况根本没有) vpermilps将控制向量作为内存操作数,而不是源数据。)

这是好于vpermps zmm,zmm,zmm因为洗牌有1周周期的延迟,而不是3(在SKYLAKE微架构-avx512)。

即使在循环之外,加载随机播放控制向量仍可能是您最好的选择。

3 AVX-512和分支

我对于在分支方面理论上掩蔽可以做什么感到困惑。 假设我有一个Skylake-SP(哈,我希望......),我们忽略了编译器功能,理论上可能的是: 如果分支条件依赖于静态标志,并且所有分支都将数组设置为计算结果, 假设编译器不将其优化为两个单独的循环 ,它是否可以向量化? 如果仅 ...

4 AVX2 和 AVX-512 有什么区别?

在SIMD和并行化方面,AVX2和AVX-512有什么区别? 它们是相同的还是不同的? 我刚刚看到在 AVX-512 中使用了 double8,而在 AVX2 中使用了 double4? 我正在使用 PyOpenCL 用 C 编写内核代码,但不确定有什么区别。 ...

5 在VS 2017中禁用AVX-512本征

我没有Xeon Phi,也不打算为它编写代码。 因此,在AVX-512成为主流之前(有传言说是从Intel Gen 9开始的情况),这些内在函数对我没有用。 AVX / 2缺少_mm_cvtepi64_epi32 ,例如,它存在于AVX-512中。 我想将其编写为一个函数(使用随机播放 ...

6 AVX-512中的未定义参考

我有一个在Xeon Phi上运行的C代码,其中包含许多AVX-512内部函数。 该代码编译良好,直到以下几行为止: 编译器发出以下错误: 我的第一个问题是,为什么编译器将_mm512_cvttps_epi32和_mm512_cvtepi32_ps转换为_mm512_cvtt ...

7 缺少面罩的AVX-512内部要素吗?

英特尔的内在函数指南列出了 AVX-512 K *掩码指令的许多内在函数 ,但似乎缺少一些: KSHIFT {左/右} 卡德 考试 英特尔开发人员手册声称内部函数不是必需的,因为它们是由编译器自动生成的。 但是如何做到这一点? 如果这意味着__mmask * ...

8 AVX-512 浮点比较和掩码

我对 SIMD 不太熟悉,但我之前用 AVX 写过一些非常简单的东西。 现在我也想用 AVX-512 实现一些旧的 AVX 代码。 我打算做什么: 我用 AVX 做了什么: 现在我被困在 AVX-512 上。 使用__m512 _mm512_and_ps (__m512 a, __m512 b)会很 ...

9 模拟AVX-512掩码指令

根据文档,从AVX-512指令集上的gcc 4.9开始支持,但是我有gcc 4.8 。 我目前有类似这样的代码来汇总一个内存块(保证少于256个字节,因此不会有溢出的烦恼): 现在,浏览文档,如果剩下四个字节,我可以使用: (请注意,我找不到的任何地方都没有记录__mmask8 ...

10 VS2008中的AVX-512指令库

我在Visual Studio 2017中内置了一个使用AVX-512内部函数的C ++库。 我需要将库链接到VS2008 C ++代码。 该库用于从图像中提取线条。 所有内部指令都封装在库中。 VS2008代码传入char* data , LineSpec (具有4个浮点数的结构)和c ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM