我刚刚开始使用SSE,我很困惑如何获得a的最大整数值(max
)__m128i
.例如:
__m128i t = _mm_setr_ps(0,1,2,3);
// max(t) = 3;
Run Code Online (Sandbox Code Playgroud)
搜索引导我去MAXPS
指导,但我似乎无法找到如何使用它"xmmintrin.h"
.
此外,是否有任何"xmmintrin.h"
您建议的文档,而不是查看头文件本身?
有没有人想过如何计算SSE4.x中8位整数向量的模式(统计量)?为了澄清,这将是128位寄存器中的16x8位值.
我希望结果作为矢量掩码选择模值元素.即结果_mm_cmpeq_epi8(v, set1(mode(v)))
,以及标量值.
提供一些额外的背景; 虽然上面的问题本身就是一个有趣的问题,但我已经通过线性复杂度可以想到的大多数算法.这个课程将消除我从计算这个数字中获得的任何收益.
我希望在这里与大家一起寻找一些深刻的魔法.这有可能是一个近似值可能需要打破这种结合,例如"选择一个频繁出现的元素"例如(NB差针对最),这将是值得的.概率答案也是可用的.
SSE和x86有一些非常有趣的语义.可能值得探索超优化传递.
我想使用SIMD操作在字节数组中找到最小/最大值.到目前为止,我能够通过数组并将最小/最大值存储到__m128i变量中,但这意味着我正在寻找的值与其他值混合在一起(确切地说是15个其他值).
我在这里和这里找到了这些讨论的整数,这个页面用于浮点数,但我不明白如何工作_mm_shuffle*.所以我的问题是:
我编写了一个算法来获得 std::vector 中两个元素之间的最大差异,其中两个值中较大的值必须比较低的值在更高的索引处。
unsigned short int min = input.front();
unsigned short res = 0;
for (size_t i = 1; i < input.size(); ++i)
{
if (input[i] <= min)
{
min = input[i];
continue;
}
int dif = input[i] - min;
res = dif > res ? dif : res;
}
return res != 0 ? res : -1;
Run Code Online (Sandbox Code Playgroud)
是否可以使用 SIMD 优化此算法?我是 SIMD 的新手,到目前为止我没有成功