相关疑难解决方法(0)

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

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

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

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

floating-point optimization x86 assembly sse

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

使用SSE的水平最小值和最大值

我有一个使用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字节整数的最小值和最大值.

任何好的建议都非常感谢:)

谢谢

c++ sse max minimum avx

11
推荐指数
2
解决办法
5804
查看次数

在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
查看次数

SSE3内在函数:如何找到大量浮点数的最大值

我有以下代码来查找最大值

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)

c++ sse intrinsics

7
推荐指数
1
解决办法
2250
查看次数

从__m128i中查找最小/最大值

我想使用SIMD操作在字节数组中找到最小/最大值.到目前为止,我能够通过数组并将最小/最大值存储到__m128i变量中,但这意味着我正在寻找的值与其他值混合在一起(确切地说是15个其他值).

我在这里这里找到了这些讨论的整数,这个页面用于浮点数,但我不明白如何工作_mm_shuffle*.所以我的问题是:

  1. 为了从__m128i变量中提取最小/最大字节(或无符号字节)值,我必须执行哪些SIMD操作?
  2. _mm_shuffle*如何工作?当我在网上查看"最小"文档时,我不明白.我知道它与_MM_SHUFFLE宏有关,但我没有得到这个例子.

c++ x86 sse simd

5
推荐指数
1
解决办法
1987
查看次数

找到 sse 向量 m128 中的最大浮点数

我找到了以下 _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++ simd intrinsics

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

标签 统计

c++ ×5

sse ×5

simd ×3

x86 ×3

avx ×2

intrinsics ×2

assembly ×1

floating-point ×1

max ×1

minimum ×1

optimization ×1