movhlps xmm1,xmm0 ; Move top two floats to lower part of xmm1
maxps xmm0,xmm1 ; Get the maximum of the two sets of floats
pshufd xmm1,xmm0,$55 ; Move second float to lower part of xmm1
maxps xmm0,xmm1 ; Get the maximum of the two remaining floats
movhlps %xmm0, %xmm1 # Move top two floats to lower part of %xmm1
maxps %xmm1, %xmm0 # Get minimum of sets of two floats
pshufd $0x55, %xmm0, %xmm1 # Move second float to lower part of %xmm1
maxps %xmm1, %xmm0 # Get minimum of all four floats originally in %xmm0
4条答案
按热度按时间mwngjboj1#
如果有人关心的话,因为内部函数似乎是这些天要走的路,这里有一个内部函数方面的解决方案。
我不知道那是否比这更好:
jq6vz3qz2#
如果您发现自己需要对向量进行水平操作,尤其是在内部循环中,那么 * 通常 * 这是您以错误的方式处理SIMD实现的信号。SIMD喜欢对向量进行元素级操作-如果您喜欢,可以选择“垂直”操作,而不是水平操作。
至于文档,有一个very useful reference on intel.com,它包含所有操作码和内部函数,从MMX到SSE的各种风格,一直到AVX和AVX-512。
k10s72fa3#
根据this page,没有水平最大值,您需要垂直测试元素:
反之,取最小值:
kcwpcxri4#
SSE中没有Horizontal Maximum操作码(至少直到我停止跟踪新的SSE指令为止)。
所以你只能做一些洗牌。你最终得到的是...
http://locklessinc.com/articles/instruction_wishlist/
MSDN记录了内部函数Map和宏函数Map
http://msdn.microsoft.com/en-us/library/t467de55.aspx