当前位置: 首页 > 知识库问答 >
问题:

将__m256值设置为所有一位的最快方法

淳于鹏
2023-03-14

如何将__m256值中的所有位设置为1?使用AVX或AVX2的本质?

而我似乎在AVX中找不到一个简单的按位非运算?如果这是可用的,我可以简单地使用setzero,后面跟着一个向量NOT。

共有1个答案

逑衡
2023-03-14

另请参见将CPU寄存器中的所有位有效地设置为1,包括AVX、AVX2和AVX512 zmm和k(掩码)寄存器。

很明显,您甚至没有查看asm输出,这是微不足道的:

#include <immintrin.h>
__m256i all_ones(void) { return _mm256_set1_epi64x(-1); }

用包含AVX2的任何-marg编译为with GCC和clang

    vpcmpeqd        ymm0, ymm0, ymm0
    ret
  __m256 nans = _mm256_castsi256_ps( _mm256_set1_epi32(-1) );

编译器不喜欢动态生成更复杂的常量,即使是可以通过简单的移位从所有常量生成的常量。即使尝试编写__m128i float_signbit_mask=_mm_srli_epi32(_mm_set1_epi16(-1),1),编译器通常也会进行常量传播并将向量放入内存。这使得他们可以将其折叠成内存操作数,当以后在没有循环来提升常量的情况下使用时。

而我似乎在AVX中找不到一个简单的按位非运算?

您可以使用vxorps(_mm256_xor_ps)对所有的对象进行XORing。不幸的是,SSE/AVX没有提供一种方法来做一个没有向量常数的NOT。

对于像vxorps这样的按位指令来说,这不是一个问题(即使助记符有ps,但它没有来自Skylake,IIRC上的FP或vec-int域的旁路延迟)。

因此,通常使用整数指令创建set1(-1)常量是安全的,因为这是一个NaN,通常不会将其用于像mul或add这样的FP数学指令。

 类似资料:
  • 问题内容: 我有一个,我想将每个索引的值设置为相同的值。 有一种很明显的方法(迭代): 但是我想知道是否有一种可以利用的方法或某种等效方法可以绕过迭代的需要。有没有办法做到这一点? 编辑: 从 这是完全相同的过程,这表明可能没有更好的方法可以做到这一点。 +1对所有提出建议的人-你们都是正确的,谢谢。 问题答案: 试试:数组javadoc

  • 问题内容: 如何在SQL表中将所有0值都设置为NULL? 提前致谢。 问题答案:

  • 当数字列表中存在异常值时,其直方图的最后一个条柱短且稀疏。因此,我希望有最后一个箱子来使用范围。对于此示例,包含大于 的所有值将为 10。 上面列表的直方图 我还没想好怎么和海伯恩在一起。如果matplotlib能奏效,那也太棒了。提前致谢!

  • 要清除所有位,您通常会在中看到一个独占或。反面也有这样的把戏吗? 我所能想到的就是用一个额外的指令来反转零。

  • 本文向大家介绍python寻找list中最大值、最小值并返回其所在位置的方法,包括了python寻找list中最大值、最小值并返回其所在位置的方法的使用技巧和注意事项,需要的朋友参考一下 实例如下所示: 以上这篇python寻找list中最大值、最小值并返回其所在位置的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。

  • 问题内容: 考虑数组 我可以做 但这需要找到所有对象才可以找到第一个。 有没有更有效的方法? 我一直在试图找出我是否可以传递参数,从而获取的第一个分类,而不是最后一次。 编辑关于[dup]。 有几个原因使这个问题不同。 该问题和答案涉及价值观的平等。这是关于。 这些答案都遭受我的答案面临的同一问题。注意,我提供了一个完全有效的答案,但强调了它的效率低下。我正在寻找解决效率低下的问题。 编辑有关第二