使用 AVX-512 乘以“uint64_t”的向量 [复制]

Multiplying vectors of `uint64_t` using AVX-512 [duplicate]

提问人:Litherum 提问时间:10/1/2023 更新时间:10/1/2023 访问量:36

问:

是否可以使用 AVX-512 将 2 个向量相乘?根据英特尔的文档,有以下指令将整数向量相乘:uint64_t

  • PMULDQ(乘法双字整数),对有符号整数进行操作
  • PMULHRSW(Packed Multiply High With Round and Scale),对有符号整数进行操作
  • PMULHUW(Multiply Packed Unsigned Integers and Store High Result),用于存储高结果,而不是低结果
  • PMULHW(Multiply Packed Signed Integers and Store High Result),用于存储高结果,而不是低结果
  • PMULLD/PMULLQ(乘法整数和存储低结果),对有符号整数进行操作
  • PMULLW(Multiply Packed Signed Integers and Store Low Result),它对有符号整数进行操作
  • PMULUDQ(Multiply Packed Unsigned Doubleword Integers),它只对双字值进行操作,而不是对四字值进行操作

似乎没有办法在单个 AVX-512 指令中将 2 个向量相乘(并获得低结果),这似乎令人惊讶。真的不可能吗?如果不是,这种遗漏的理由是什么?uint64_t

使用 AVX2 和 AVX-512 性能乘以 64 位整数是关于有符号整数的,因此它没有回答这个问题。将int64_t数组相乘的最快方法?也是关于有符号整数的,所以它也没有回答这个问题。

x86-64 AVX512

评论

1赞 chtz 10/1/2023
有符号乘法和无符号乘法的结果的下半部分是相同的。
0赞 Peter Cordes 10/1/2023
你想要。这就是编译器自动矢量化乘法的方式,您可以查看 asm 以获取循环,例如检查这一点。(请注意,它只存在;没有 legacy-SSE,因为它是 AVX-512 中的新功能。vpmullquint64_ta[i] *= b[i]vpmullqpmullq
0赞 Peter Cordes 10/1/2023
玛格丽特的回答 为什么 imul 用于乘以无符号数字? 我认为是对另一种情况的一个很好的解释,即我们使用名义上被描述为“有符号”的非加宽乘法(出于某种原因,即使它没有加宽形式。因此,我将其作为列表中的第一个副本,以及其他一些提出相同观点的副本,以及一个提及 .vpmullqvpmullq
0赞 Litherum 10/2/2023
啊哈!我错过了,如果你只关心低位,答案是一样的。谢谢!stackoverflow.com/questions/42587607/......确实是一个很好的解释。

答: 暂无答案