我需要一些关于如何在 Visual Studio 上使用 SSE 逻辑指令的帮助。基于MSDN 网站,
__m128 _mm_and_ps(__m128 a , __m128 b );
ANDPS
Run Code Online (Sandbox Code Playgroud)
可用于对操作数a和b执行逻辑与操作。但我无法弄清楚获取结果所需的确切步骤(内存加载和初始化、设置、存储等)。
具体来说,我想知道如何:
有人可以在一个例子中告诉我如何做到这一点吗?
谢谢!
如何在XMM寄存器中对值进行逐位否定?据我所知,没有这样的指示.唯一有否定的指令是pandn,但是要用它来简单地否定一个XMM寄存器中的值,我必须填充另一个填充的XMM寄存器1.
是否有另一种方法来否定XMM寄存器中的位?或者有没有一种聪明的方法来填充XMM寄存器而1无需访问内存?
我是 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) 我使用内联汇编,我的代码是这样的:
__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) 我使用以下内容来提取 的符号位__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该代码的目的是根据另一个向量的相应元素中的符号来更改向量元素的符号。
我正在学习 SIMD 内在函数和并行计算。我不确定Intel对x86指令的定义sqrtpd是否 表示将同时计算传递给它的两个数字的平方根:
对源操作数(第二个操作数)中的两个、四个或八个压缩双精度浮点值的平方根执行 SIMD 计算,并将压缩双精度浮点结果存储在目标操作数(第二个操作数)中第一个操作数)。
我知道它明确表示SIMD 计算,但这是否意味着对于此操作,将同时计算两个数字的根?
我阅读了这两个操作的手册描述,但还不明白其中的区别。有人可以举例说明 shufpd 与 pshufd 的比较吗?
所以我阅读了英特尔关于 _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 做什么)?
在Intel x64手册中,它表示在32位SSE2模式下XMM寄存器为0-7.为什么95%使用这些寄存器的指令跳过0并使用1-4?
我必须以最快的方式从文件中读取8k x 8k矩阵.截至目前,我正在使用fstat并将整个文件读入内存,然后对加载的数据进行操作.
这是最快的方式吗?我正在使用带有SSE指令的x86处理器.我能利用他们的文件阅读优势吗?
谢谢
sse ×10
simd ×5
assembly ×4
x86 ×4
avx ×2
c ×2
c++ ×2
intrinsics ×2
bitwise-not ×1
file-io ×1
optimization ×1