你有一个三(或四)个浮点数的向量.总结它们的最快方法是什么?
SSE(movaps,shuffle,add,movd)总是比x87快吗?SSE4.2中的水平加法说明值得吗?移动到FPU的成本是多少,然后是faddp,faddp?什么是最快的特定指令序列?
"尝试安排事情,这样你可以一次总结四个向量"将不被接受作为答案.:-)
我正在考虑为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:这不是链接问题的重复 - 注意我要求的是最大元素的索引,而不仅仅是元素值.
有没有办法获得存储在__m256d变量中的值的总和?我有这个代码.
acc = _mm256_add_pd(acc, _mm256_mul_pd(row, vec));
//acc in this point contains {2.0, 8.0, 18.0, 32.0}
acc = _mm256_hadd_pd(acc, acc);
result[i] = ((double*)&acc)[0] + ((double*)&acc)[2];
Run Code Online (Sandbox Code Playgroud)
此代码有效,但我想用SSE/AVX指令替换它.
我正在使用长int数据,我试图确定数组中的最小元素.我知道循环遍历数组的传统方法来找到最小值.这个问题是检查是否有其他方法可以加快速度.
这个数组的某些属性可能可以帮助我们加快速度,但我不确定如何.
该数组恰好有8个长整数.每当我们调用该函数时,我们从数组中找到一个min,并且数字被另一个数字替换,我们重复这一步.(至少80亿次)
我想要记住下一次迭代的第二大数字(因为我们将在当前迭代中对它们进行比较).与通过数组的线性实现相比,这是否有用?
也允许排序,但我们必须以某种方式记住使用临时数组的原始位置.这会更有效吗?
还能以某种方式使用SIMD来确定长期最小值吗?即使是毫秒级的加速也很有用,因为我正在进行数十亿次此操作.