相关疑难解决方法(0)

在x86上做水平浮点矢量和的最快方法

你有一个三(或四)个浮点数的向量.总结它们的最快方法是什么?

SSE(movaps,shuffle,add,movd)总是比x87快吗?SSE4.2中的水平加法说明值得吗?移动到FPU的成本是多少,然后是faddp,faddp?什么是最快的特定指令序列?

"尝试安排事情,这样你可以一次总结四个向量"将不被接受作为答案.:-)

floating-point optimization x86 assembly sse

41
推荐指数
4
解决办法
2万
查看次数

在x86 SIMD向量中查找最大元素的索引

我正在考虑为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:这不是链接问题的重复 - 注意我要求的是最大元素的索引,而不仅仅是元素值.

c++ x86 sse simd avx

9
推荐指数
2
解决办法
3802
查看次数

使用SSE/AVX获取存储在__m256d中的值的总和

有没有办法获得存储在__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指令替换它.

c++ optimization sse avx avx2

6
推荐指数
2
解决办法
1690
查看次数

在非常小的阵列中找到最小值

我正在使用长int数据,我试图确定数组中的最小元素.我知道循环遍历数组的传统方法来找到最小值.这个问题是检查是否有其他方法可以加快速度.

这个数组的某些属性可能可以帮助我们加快速度,但我不确定如何.

该数组恰好有8个长整数.每当我们调用该函数时,我们从数组中找到一个min,并且数字被另一个数字替换,我们重复这一步.(至少80亿次)

我想要记住下一次迭代的第二大数字(因为我们将在当前迭代中对它们进行比较).与通过数组的线性实现相比,这是否有用?

也允许排序,但我们必须以某种方式记住使用临时数组的原始位置.这会更有效吗?

还能以某种方式使用SIMD来确定长期最小值吗?即使是毫秒级的加速也很有用,因为我正在进行数十亿次此操作.

c c++ arrays algorithm performance

0
推荐指数
1
解决办法
330
查看次数

标签 统计

c++ ×3

sse ×3

avx ×2

optimization ×2

x86 ×2

algorithm ×1

arrays ×1

assembly ×1

avx2 ×1

c ×1

floating-point ×1

performance ×1

simd ×1