首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AVX512中的人口计数

AVX512中的人口计数
EN

Stack Overflow用户
提问于 2020-05-18 23:06:56
回答 1查看 630关注 0票数 2

我一直试图在一台支持_mm256_popcnt_epi64的机器上使用AVX512,并在以前为AVX2进行优化的代码上使用。

不幸的是,我遇到了找不到函数的问题。然而,找到了相应的__m512i等效值。不推荐使用__m256i函数吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-18 23:53:18

_mm512_popcnt_epi64AVX512 512-VPOPCNTDQ的一部分。256位和128位版本还要求AVX512VL使用带有128位或256位向量的AVX512指令.

主流的AVX512 CPU都有AVX512-VL。Xeon没有have 512-VL。

(_mm512_popcnt_epi8和epi16在冰湖也是新的,作为AVX512 512-BITALG的一部分)

也许您忘了启用必要的编译器选项(比如GCC -march=native来启用您正在编译的机器所能做的一切),或者您正在为一个没有这两种特性的目标进行编译。如果是这样的话,编译器就不会将_m256_popcnt_epi64定义为一个内在的,所以在C中它将假设它的和未声明的函数并发出对它的调用。(链接时当然找不到。)和/或它将警告或错误(C或C++)的原型没有找到。

很少有CPU目前拥有have 512-VPOPCNTDQ (维基百科AVX512特性与CPU矩阵):

  • 骑士磨坊(最后一代Xeon Phi):只有and 512-VPOPCNTDQ,没有AVX512VL和BITALG.因此,只有__m512i版本可以用于gcc -O3 -march=knm。您肯定应该在Xeon上使用512位向量,除非数据布局在256上工作得很好,并且需要对512位进行额外的洗牌。但是请注意,对于一些AVX / AVX2指令,它没有512位版本,比如元素小于32位的改组。(无AVX512 BW)
  • 冰湖/虎湖:有AVX512 VPOPCNTDQ、BITALG和AVX512 VL,因此在为这个目标微体系结构编译时,支持_mm256_popcnt_epi64epi8,例如gcc -O3 -march=icelake-client。(假设编译器的头是正确的)。 -march=icelake-client GCC8.3和更早版本的有一个错误,其中 / 不启用 -mavx512vpopcntdq.(GCC7不知道-march=icelake-client)。它是在GCC8.4中修正的,所以要么升级到最新的GCC8,要么升级到最新的稳定GCC;再过几年的开发通常会帮助GCC用新的ISA扩展(如AVX-512 ),特别是掩码寄存器来制作更好的代码。或者只需手动使用-march=icelake-client -mavx512vpopcntdq即可:https://godbolt.org/z/a7bhcjdhr

在冰湖上选择256位和512位矢量是一种权衡,就像Skylake-x:当512位矢量uops在飞行时,端口1上的矢量ALU不会被使用。最大涡轮时钟速度可以降低。SIMD指令降低CPU频率。因此,如果从更宽的向量(例如,由于内存瓶颈,或者SIMD循环只是更大程序的一小部分)获得的速度不太快,那么在一个循环中使用512位向量可能会影响整体性能。

但是请注意,冰岛客户端CPU没有受到太大的影响,我不确定vpopcnt指令是否还算“很重”,可能没有在客户端CPU上降低最大透平。大多数整数SIMD指令不算。参见关于LLVM [X86]更喜欢冰/火箭/老虎湖(PR48336)上的512个位矢量的讨论。但是,端口1中的矢量ALU部分仍处于关闭状态,而512位uop正在运行.

其他CPU根本不支持硬件SIMD,也没有任何形式的_mm512_popcnt_epi64可用。

即使你只拥有AVX2,而不是AVX512,SIMD也是相对于标量popcnt的一种胜利,它在现代CPU上的非微型阵列上具有快速vpshufb (_mm256_shuffle_epi8)。https://github.com/WojciechMula/sse-popcount/有AVX2和AVX512版本,它们使用vpternlogd进行哈雷密封积累,以减少用于弹出的SIMD查找量。

在堆栈溢出上,使用AVX-512或AVX-2在大数据上计数1位(人口计数)。还显示了几年前复制的一些代码。

如果需要对单独的元素进行计数,只需使用针对零向量的vpshufbvpsadbw的标准解包将其合并为64位的qword块即可。

如果您需要位置填充(每个位位置的单独和),请参见https://github.com/mklarqvist/positional-popcount

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

https://stackoverflow.com/questions/61880496

复制
相关文章

相似问题

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