Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用英特尔内部集成电路(AVX)中的混合指令_C++_C_Intrinsics_Avx_Immediate Operand - Fatal编程技术网

C++ 使用英特尔内部集成电路(AVX)中的混合指令

C++ 使用英特尔内部集成电路(AVX)中的混合指令,c++,c,intrinsics,avx,immediate-operand,C++,C,Intrinsics,Avx,Immediate Operand,我有一个关于AVX mm256 blend pd函数的问题 我想在大量使用_mm256_blendv_pd函数的地方优化我的代码。不幸的是,这有一个相当高的延迟和低吞吐量。此函数将三个_m256d变量作为输入,其中最后一个变量表示用于从前两个变量中选择的掩码 我发现了另一个函数_mm256_blend_pd,它采用位掩码而不是u m256d变量作为掩码。当掩码是静态的时,我可以简单地传递类似于0b0111的消息,从第一个变量中获取第一个元素,然后从第二个变量的最后3个元素中获取。然而,在我的例子

我有一个关于AVX mm256 blend pd函数的问题

我想在大量使用_mm256_blendv_pd函数的地方优化我的代码。不幸的是,这有一个相当高的延迟和低吞吐量。此函数将三个_m256d变量作为输入,其中最后一个变量表示用于从前两个变量中选择的掩码

我发现了另一个函数_mm256_blend_pd,它采用位掩码而不是u m256d变量作为掩码。当掩码是静态的时,我可以简单地传递类似于0b0111的消息,从第一个变量中获取第一个元素,然后从第二个变量的最后3个元素中获取。然而,在我的例子中,掩码是使用返回一个m256d变量的_mm_cmp_pd函数计算的。我发现我可以使用_mm256_movemask_pd从掩码返回int,但是当将它传递到函数_mm256_blend_pd时,我得到一个错误:最后一个参数必须是4位立即数

有没有办法用前4位传递这个整数?或者有没有其他类似于movemask的功能允许我使用_mm256_blend_pd?或者,我是否可以使用另一种方法来避免使用cmp、movemask和blend,这种方法在本用例中更有效?

\u mm256\u blend\u pd是将其控制操作数作为立即常数嵌入到指令的机器代码中的内在方法。这就是“立即”在汇编/机器代码术语中的含义

在C++术语中,控制ARG必须是CONTXPR,这样编译器就可以在编译时嵌入到指令中。不能将其用于运行时变量混合

不幸的是,像vblendvpd这样的可变混合指令速度较慢,但它们在Skylake上只有2个UOP,1或2个周期的延迟取决于您测量关键路径通过的输入。在Skylake上,这些UOP可以在3个向量ALU端口中的任何一个上运行。更糟糕的是,Haswell/Broadwell仅限于端口5,与Shuffle竞争。Zen甚至可以将它们作为单个uop运行

在AVX512将掩蔽作为其他指令的一部分,并根据掩蔽寄存器为我们提供单uop混合指令(如vblendmpd ymm0{k1}、ymm1、ymm2混合)之前,一般情况下没有更好的方法

在某些特殊情况下,您可以有条件地将_mm256_和_pd设置为零,而不是混合,例如,在添加之前将输入设置为零,而不是在添加之后进行混合

TL:DR:_mm256_blend_pd允许您在控件为编译时常量的特殊情况下使用更快的指令。

\u mm256_blend_pd是将其控件操作数作为立即常量嵌入到指令机器代码中的内在变量。这就是“立即”在汇编/机器代码术语中的含义

在C++术语中,控制ARG必须是CONTXPR,这样编译器就可以在编译时嵌入到指令中。不能将其用于运行时变量混合

不幸的是,像vblendvpd这样的可变混合指令速度较慢,但它们在Skylake上只有2个UOP,1或2个周期的延迟取决于您测量关键路径通过的输入。在Skylake上,这些UOP可以在3个向量ALU端口中的任何一个上运行。更糟糕的是,Haswell/Broadwell仅限于端口5,与Shuffle竞争。Zen甚至可以将它们作为单个uop运行

在AVX512将掩蔽作为其他指令的一部分,并根据掩蔽寄存器为我们提供单uop混合指令(如vblendmpd ymm0{k1}、ymm1、ymm2混合)之前,一般情况下没有更好的方法

在某些特殊情况下,您可以有条件地将_mm256_和_pd设置为零,而不是混合,例如,在添加之前将输入设置为零,而不是在添加之后进行混合


TL:DR:_mm256_blend_pd允许您在控件是编译时常量的特殊情况下使用更快的指令。

您可以使用_mm256_permutevar_ps代替blend吗?哦,我明白了,现在它更有意义了。我有点遗憾,但非常感谢你的澄清。那么我必须坚持使用blendv。@anatolyg:vpermilps确实需要一个向量控制操作数,但它是一个只有1个数据输入的洗牌。我看不到任何明显的方式与之融合。如果你有什么想法,可以在问题下方的评论中询问OP。你能用_mm256_permutevar_ps代替blend吗?哦,我明白了,现在它更有意义了。我有点遗憾,但非常感谢你的澄清。那么我必须坚持使用blendv。@anatolyg:vpermilps确实需要一个向量控制操作数,但它是一个只有1个数据输入的洗牌。我看不到任何明显的方式与之融合。如果你有什么想法,可以在问题下方的评论中询问OP。