相关疑难解决方法(0)

使用SSE指令点产品性能

是它更快地通过的装置计算两个向量的点积dpps指令形式SSE 4.1指令集或通过使用一系列的addps,shufpsmulps从SSE 1?

optimization performance x86 assembly simd

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

SSE - 不存在的 haddsub 内在?

在浏览可用的内在函数时,我注意到无处可见可用的水平 addsub/subadd 指令。它在过时的 3DNow 中可用!扩展但是由于显而易见的原因,它的使用是不切实际的。在 SSE3 扩展中没有实现这种“基本”操作以及类似的水平和 addsub 操作的原因是什么?

顺便说一句,现代指令集(SSE3、SSE4、AVX……)中最快的替代方法是什么?(每个值有 2 个双打,即 __m128d)

sse simd intrinsics

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

矢量组件中的Sum元素

有人可以向我解释为什么以下程序不会在屏幕上显示任何内容?所以我试图做的是计算一个向量的总和,如下所示:

.model small
.stack 100h
.data
  vector db  1,2,3,4,5,6,7,8,9
  suma db 0
  count db 9
  msg db 10,13,"Sum is:$"

.code
  mov ax,@data
  mov ds,ax

  mov si,0
  xor si,si
  xor cx,cx
  mov cl,count
repeta:
  mov al,vector[si]
  add suma,al
  inc si
loop repeta

  mov bx,ax
  mov ah,09
  lea dx,msg
  int 21h
  mov ah,2
  mov dl,bl
  int 21h
  mov ah,2
  mov dl,bl
  int 21h

  mov ah,4ch
  int 21h    
end
Run Code Online (Sandbox Code Playgroud)

assembly x86-16

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

为什么矢量长度SIMD代码比普通C慢

为什么我的SIMD vector4长度函数比单纯的向量长度方法慢3倍?

SIMD vector4长度函数:

__extern_always_inline float vec4_len(const float *v) {
    __m128 vec1 = _mm_load_ps(v);
    __m128 xmm1 = _mm_mul_ps(vec1, vec1);
    __m128 xmm2 = _mm_hadd_ps(xmm1, xmm1);
    __m128 xmm3 = _mm_hadd_ps(xmm2, xmm2);
    return sqrtf(_mm_cvtss_f32(xmm3));
}
Run Code Online (Sandbox Code Playgroud)

天真的实现:

sqrtf(V[0] * V[0] + V[1] * V[1] + V[2] * V[2] + V[3] * V[3])
Run Code Online (Sandbox Code Playgroud)

SIMD版本花费了16110ms来迭代10亿次。天真的版本快了约3倍,只花了4746ms。

#include <math.h>
#include <time.h>
#include <stdint.h>
#include <stdio.h>
#include <x86intrin.h>

static float vec4_len(const float *v) {
    __m128 vec1 = _mm_load_ps(v);
    __m128 xmm1 = _mm_mul_ps(vec1, vec1);
    __m128 xmm2 = _mm_hadd_ps(xmm1, xmm1);
    __m128 …
Run Code Online (Sandbox Code Playgroud)

c sse simd compiler-optimization microbenchmark

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

8086 XLAT替代品

XLATMASM中不起作用.

我可以使用什么来获得相同的行为:

XLAT :将AL设置为存储器字节DS:[(E)BX + unsigned AL]

x86 assembly masm x86-16

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

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

内在向量与朴素向量约简结果的差异

我一直在比较 Intrinsics 向量缩减、朴素向量缩减和使用 openmp 编译指示的向量缩减的运行时间。然而,我发现这些场景的结果是不同的。代码如下 - (内在向量归约取自 - Fastest way to dohorizo​​ntal SSE vector sum(或其他归约)

#include <iostream>
#include <chrono>
#include <vector>
#include <numeric>
#include <algorithm>
#include <immintrin.h>


inline float hsum_ps_sse3(__m128 v) {
    __m128 shuf = _mm_movehdup_ps(v);        // broadcast elements 3,1 to 2,0
    __m128 sums = _mm_add_ps(v, shuf);
    shuf        = _mm_movehl_ps(shuf, sums); // high half -> low half
    sums        = _mm_add_ss(sums, shuf);
    return        _mm_cvtss_f32(sums);
}


float hsum256_ps_avx(__m256 v) {
    __m128 vlow  = _mm256_castps256_ps128(v);
    __m128 vhigh = _mm256_extractf128_ps(v, 1); // high …
Run Code Online (Sandbox Code Playgroud)

c++ vector simd intrinsics ieee-754

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

X86操作码将xmm寄存器移动到通用寄存器

什么是短x86指令序列将xmm0寄存器移动到eax和edx?

x86 assembly nasm

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

如何使用_mm_extract_epi8函数?

我正在使用_mm_extract_epi8 (__m128i a, const int imm8)函数,它有const int参数.当我编译此c ++代码时,收到以下错误消息:

错误C2057预期的常量表达式

__m128i a;

for (int i=0; i<16; i++)
{
    _mm_extract_epi8(a, i); // compilation error
}
Run Code Online (Sandbox Code Playgroud)

我怎么能在循环中使用这个功能?

c++ sse simd vectorization visual-studio

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

使用 AVX 内在函数对 __m512i 中的 8 位整数求和

AVX512 为我们提供了对__mm512向量中所有单元格求和的内在函数。然而,他们的一些同行却不见了:还没有_mm512_reduce_add_epi8

_mm512_reduce_add_ps     //horizontal sum of 16 floats
_mm512_reduce_add_pd     //horizontal sum of 8 doubles
_mm512_reduce_add_epi32  //horizontal sum of 16 32-bit integers
_mm512_reduce_add_epi64  //horizontal sum of 8 64-bit integers
Run Code Online (Sandbox Code Playgroud)

基本上,我需要MAGIC在以下代码段中实现。

__m512i all_ones = _mm512_set1_epi16(1);
short sum_of_ones = MAGIC(all_ones);
/* now sum_of_ones contains 32, the sum of 32 ones. */
Run Code Online (Sandbox Code Playgroud)

最明显的方法是使用_mm512_storeu_epi8数组元素并将其相加,但这会很慢,而且可能会使缓存无效。我想存在一种更快的方法。

实施的奖励积分_mm512_reduce_add_epi16也是如此。

c x86 simd intrinsics avx

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

如何计算 __m128 变量。(另外 _mm_blendv_ps 是做什么的)?

所以我阅读了英特尔关于 _mm_blendv_ps 的文档,但不太明白该函数的真正作用。所以我写了下面的代码:

    __m128 a = { 18.0,4.0,19.0,21.0 };
    __m128 b = { 67.0,92.0,888.0,47.0 };
    __m128 mask = { 1.0,0.0,0.0,1.0 };

    __m128 result = _mm_blendv_ps(a, b, mask);
    cout << "Result is: " << result[0] << " " << result[1] << " " << result[2] << " " << result[4] << endl;
Run Code Online (Sandbox Code Playgroud)

但我收到错误“没有运算符 [] 与这些操作数匹配”。为什么我无法访问结果?结果不是32位浮点向量吗?

那么为什么我无法访问结果呢?我怎样才能访问它?cout 的结果是什么(blendv 做什么)?

c++ sse simd

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