Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.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++ 广播一个任意元素的uu m128向量_C++_X86_Sse_Simd_Sse2 - Fatal编程技术网

C++ 广播一个任意元素的uu m128向量

C++ 广播一个任意元素的uu m128向量,c++,x86,sse,simd,sse2,C++,X86,Sse,Simd,Sse2,我需要广播一个任意元素的uum128向量。 例如,第二个元素: __m128 a = {a0, a1, a2, a3}; __m128 b = {a1, a1, a1, a1}; 我知道有内在的_mm_set1_ps(float)和_mm_broadcast_ss(float*)。 但这些内部函数可以从内存的常用寄存器加载值。 是否存在从另一个向量寄存器设置标量值的方法?我认为您必须注意“洗牌”\u epi32()。下一个助手功能将使其使用更加方便: #include <emmintri

我需要广播一个任意元素的uum128向量。 例如,第二个元素:

__m128 a = {a0, a1, a2, a3};
__m128 b = {a1, a1, a1, a1};
我知道有内在的_mm_set1_ps(float)和_mm_broadcast_ss(float*)。 但这些内部函数可以从内存的常用寄存器加载值。
是否存在从另一个向量寄存器设置标量值的方法?

我认为您必须注意“洗牌”\u epi32()。下一个助手功能将使其使用更加方便:

#include <emmintrin.h>

template <int index> inline __m128 Broadcast(const __m128 & a)
{
    return _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(a), index * 0x55));
}

int main()
{
    __m128 a = {a0, a1, a2, a3};
    __m128 b = Broadcast<1>(a);
    return 0;
}
#包括
模板内联广播(常量m128&a)
{
返回_mm_castsi128_ps(_mm_shuffle_epi32(_mm_castsi128(a),索引*0x55));
}
int main()
{
__m128a={a0,a1,a2,a3};
__m128 b=广播(a);
返回0;
}

您可以这样使用
\u mm\u shuffle\u ps

b = _mm_shuffle_ps(a, a, _MM_SHUFFLE(1,1,1,1));

非常感谢。这就是我想要的。谢谢。您的解决方案得到相同的结果。“我现在不知道哪一个是最好的。”亚历克斯通常是这一个,只要有不同。根据上下文和µarch,使用错误类型的指令可能会导致额外的旁路延迟。此指令的缺点是可能需要额外的寄存器移动(但这可能会或可能不会产生任何影响)@chtz我同意,不知何故,
pshufd
没有本质的
\uuuu m128
好吧,事实证明,这个答案毕竟是正确的。在浮点和整数之间切换几乎可以刷新整个管道