你有一个三(或四)个浮点数的向量.总结它们的最快方法是什么?
SSE(movaps,shuffle,add,movd)总是比x87快吗?SSE4.2中的水平加法说明值得吗?移动到FPU的成本是多少,然后是faddp,faddp?什么是最快的特定指令序列?
"尝试安排事情,这样你可以一次总结四个向量"将不被接受作为答案.:-)
我有一个使用SSE的功能来做很多事情,并且分析器向我显示我用来计算水平最小值和最大值的代码部分大部分时间消耗.
我一直在使用以下实现作为最小例子:
static inline int16_t hMin(__m128i buffer) {
buffer = _mm_min_epi8(buffer, _mm_shuffle_epi8(buffer, m1));
buffer = _mm_min_epi8(buffer, _mm_shuffle_epi8(buffer, m2));
buffer = _mm_min_epi8(buffer, _mm_shuffle_epi8(buffer, m3));
buffer = _mm_min_epi8(buffer, _mm_shuffle_epi8(buffer, m4));
return ((int8_t*) ((void *) &buffer))[0];
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我需要计算16个1字节整数的最小值和最大值.
任何好的建议都非常感谢:)
谢谢
我正在考虑为uint32_t实现8-ary heapsort.为此,我需要一个函数来选择8元素向量中的最大元素的索引,以便我可以将它与父元素进行比较,并有条件地执行swap和进一步的siftDown步骤.
(8 uint32_ts可以更改为例如16 uint32_ts或8 uint64_t或x86 SIMD可以有效支持的任何内容).
我有一些关于如何做到这一点的想法,但我正在寻找比非矢量化代码更快的东西,特别是我正在寻找一些能让我快速进行快速操作的东西.
我有clang ++ 3.3和Core i7-4670,所以我应该能够使用最新的x86 SIMD东西.
(顺便说一下:这是一个更大项目的一部分:https://github.com/tarsa/SortingAlgorithmsBenchmark,例如四元heapsort,所以在实施SIMD heapsort后我可以立即比较它们)
重复 - 问题是:计算x86 SIMD向量中最大元素索引的最有效方法是什么?
PS:这不是链接问题的重复 - 注意我要求的是最大元素的索引,而不仅仅是元素值.
我有以下代码来查找最大值
int length = 2000;
float *data;
// data is allocated and initialized
float max = 0.0;
for(int i = 0; i < length; i++)
{
if(data[i] > max)
{
max = data;
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用SSE3内在函数进行矢量化,但我对如何进行比较感到震惊.
int length = 2000;
float *data;
// data is allocated and initialized
float max = 0.0;
// for time being just assume that length is always mod 4
for(int i = 0; i < length; i+=4)
{
__m128 a = _mm_loadu_ps(data[i]);
__m128 b = …Run Code Online (Sandbox Code Playgroud) 我想使用SIMD操作在字节数组中找到最小/最大值.到目前为止,我能够通过数组并将最小/最大值存储到__m128i变量中,但这意味着我正在寻找的值与其他值混合在一起(确切地说是15个其他值).
我在这里和这里找到了这些讨论的整数,这个页面用于浮点数,但我不明白如何工作_mm_shuffle*.所以我的问题是:
我找到了以下 _m128i 的解决方案
int horizontal_max_Vec4i(__m128i x) {
__m128i max1 = _mm_shuffle_epi32(x, _MM_SHUFFLE(0,0,3,2));
__m128i max2 = _mm_max_epi32(x,max1);
__m128i max3 = _mm_shuffle_epi32(max2, _MM_SHUFFLE(0,0,0,1));
__m128i max4 = _mm_max_epi32(max2,max3);
return _mm_cvtsi128_si32(max4);
}
Run Code Online (Sandbox Code Playgroud)
返回 m128 的最大浮点数的等效函数是什么?
(我可以使用任何版本的SSE和AVX)
将不胜感激任何帮助
c++ ×5
sse ×5
simd ×3
x86 ×3
avx ×2
intrinsics ×2
assembly ×1
max ×1
minimum ×1
optimization ×1