标签: sse

如何使用SSE逻辑指令

我需要一些关于如何在 Visual Studio 上使用 SSE 逻辑指令的帮助。基于MSDN 网站

__m128 _mm_and_ps(__m128 a , __m128 b );
ANDPS
Run Code Online (Sandbox Code Playgroud)

可用于对操作数ab执行逻辑与操作。但我无法弄清楚获取结果所需的确切步骤(内存加载和初始化、设置、存储等)。

具体来说,我想知道如何:

  1. 执行操作,
  2. 返回结果,然后
  3. 获得结果的大小(有效位数)。

有人可以在一个例子中告诉我如何做到这一点吗?

谢谢!

x86 sse simd

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

XMM寄存器的按位否定

如何在XMM寄存器中对值进行逐位否定?据我所知,没有这样的指示.唯一有否定的指令是pandn,但是要用它来简单地否定一个XMM寄存器中的值,我必须填充另一个填充的XMM寄存器1.

是否有另一种方法来否定XMM寄存器中的位?或者有没有一种聪明的方法来填充XMM寄存器而1无需访问内存?

x86 assembly sse bit-manipulation bitwise-not

0
推荐指数
2
解决办法
763
查看次数

没有编译器优化的 SSE 内在函数

我是 SSE 内在函数的新手,并尝试通过它来优化我的代码。这是我的程序,用于计算等于给定值的数组元素。

我将代码更改为 SSE 版本,但速度几乎没有改变。我想知道我是否以错误的方式使用SSE......

此代码用于不允许我们启用编译器优化选项的分配。

无 SSE 版本:

int get_freq(const float* matrix, float value) {

    int freq = 0;

    for (ssize_t i = start; i < end; i++) {
        if (fabsf(matrix[i] - value) <= FLT_EPSILON) {
            freq++;
        }
    }

    return freq;
}
Run Code Online (Sandbox Code Playgroud)

上交所版本:

#include <immintrin.h>
#include <math.h>
#include <float.h>

#define GETLOAD(n) __m128 load##n = _mm_load_ps(&matrix[i + 4 * n])
#define GETEQU(n) __m128 check##n = _mm_and_ps(_mm_cmpeq_ps(load##n, value), and_value)
#define GETCOUNT(n) count = _mm_add_ps(count, check##n)

    int get_freq(const float* matrix, float …
Run Code Online (Sandbox Code Playgroud)

c sse simd compiler-optimization

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

如何在 AVX 寄存器上打包 16 个 16 位寄存器/变量

我使用内联汇编,我的代码是这样的:

__m128i inl = _mm256_castsi256_si128(in);
__m128i inh = _mm256_extractf128_si256(in, 1); 
__m128i outl, outh;
__asm__(
    "vmovq %2, %%rax                        \n\t"
    "movzwl %%ax, %%ecx                     \n\t"
    "shr $16, %%rax                         \n\t"
    "movzwl %%ax, %%edx                     \n\t"
    "movzwl s16(%%ecx, %%ecx), %%ecx        \n\t"
    "movzwl s16(%%edx, %%edx), %%edx        \n\t"
    "xorw %4, %%cx                          \n\t"
    "xorw %4, %%dx                          \n\t"
    "rolw $7, %%cx                          \n\t"
    "rolw $7, %%dx                          \n\t"
    "movzwl s16(%%ecx, %%ecx), %%ecx        \n\t"
    "movzwl s16(%%edx, %%edx), %%edx        \n\t"
    "pxor %0, %0                            \n\t"
    "vpinsrw $0, %%ecx, %0, %0              \n\t"
    "vpinsrw $1, %%edx, %0, …
Run Code Online (Sandbox Code Playgroud)

x86 assembly sse avx

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

AVX/SSE 将浮点符号掩码转换为 __m128i

我使用以下内容来提取 的符号位__mm128

const int sign_mask = _mm_movemask_ps(a);
Run Code Online (Sandbox Code Playgroud)

我现在想使用以下内容来混合两个向量:

v_add = _mm_blendv_ps(a, v_add_neg, _mm_castsi128_ps(v_mask));
Run Code Online (Sandbox Code Playgroud)

v_mask需要来自sign_mask但我找不到执行此操作的内在函数。

a该代码的目的是根据另一个向量的相应元素中的符号来更改向量元素的符号。

c sse simd intrinsics avx

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

sqrtpd指令是否同时计算sqrt?

我正在学习 SIMD 内在函数和并行计算。我不确定Intel对x86指令的定义sqrtpd是否 表示将同时计算传递给它的两个数字的平方根:


对源操作数(第二个操作数)中的两个、四个或八个压缩双精度浮点值的平方根执行 SIMD 计算,并将压缩双精度浮点结果存储在目标操作数(第二个操作数)中第一个操作数)。


我知道它明确表示SIMD 计算,但这是否意味着对于此操作,将同时计算两个数字的根?

parallel-processing sse simd cpu-architecture intrinsics

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

PSHUFD SHUFPD 有什么区别

我阅读了这两个操作的手册描述,但还不明白其中的区别。有人可以举例说明 shufpd 与 pshufd 的比较吗?

assembly sse

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

如何计算 __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
查看次数

XMM寄存器0未被使用

在Intel x64手册中,它表示在32位SSE2模式下XMM寄存器为0-7.为什么95%使用这些寄存器的指令跳过0并使用1-4?

x86 assembly sse

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

使用SSE指令可以在C++中读取最快的文件

我必须以最快的方式从文件中读取8k x 8k矩阵.截至目前,我正在使用fstat并将整个文件读入内存,然后对加载的数据进行操作.

这是最快的方式吗?我正在使用带有SSE指令的x86处理器.我能利用他们的文件阅读优势吗?

谢谢

c++ optimization file-io sse

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