sse相关内容

估计每个指令的周期

我已经反汇编了一个用 MSVC v140 编译的小型 C++ 程序,并试图估计每条指令的周期,以便更好地了解代码设计如何影响性能.我一直在关注 Mike Acton 在 CppCon 2014 上关于 “面向数据的设计和 C++" 的演讲,特别是我链接到的部分. 在其中,他指出了以下几行: movss 8(%rbx), %xmm1movss 12(%rbx), %xmm0 然后他声称这些 ..
发布时间:2021-11-17 02:53:31 其他开发

无法对 long double 数据类型进行 openMP 矢量化操作吗?

我正在学习 openMP,以我有限的知识,我的代码被并行化了.我正在尝试使用 openMP 矢量化技术改进此代码.但是在浏览相关阅读材料时(link),我发现这是不可能的对 long double 数据类型进行矢量化操作.有人可以提供有关原因的信息并提出除降低精度之外的解决方案吗? 链接中的内容如下:“避免SIMD硬件不支持的操作.Linux上(80位)长双精度算术,余数运算符“%"是SIM ..
发布时间:2021-09-29 19:38:22 C/C++开发

哪些版本的 Windows 支持/需要哪些 CPU 多媒体扩展?(如何检查 SSE 或 AVX 是否完全可用?)

到目前为止,我已经设法发现: SSE 和 SSE2 对于 Windows 8 及更高版本(当然也适用于任何 64 位操作系统)是必需的 AVX 仅受 Windows 7 SP1 或更高版本支持 在 Windows 上使用 SSE3、SSSE3、SSE4.1、SSE 4.2、AVX2 和 AVX-512 有什么注意事项吗? 一些说明:如果我使用 SSE/AVX 集之一的指令,我需 ..
发布时间:2021-09-25 19:41:03 其他开发

C++ SSE 内部函数:将结果存储在变量中

我无法理解使用 SSE 内在函数将某些 SIMD 计算的结果存储回“正常变量".例如,_mm_store_ps 内在函数在“英特尔内在函数指南"中的描述如下: void _mm_store_ps (float* mem_addr, __m128 a) Store 128-bits(由4个压缩单精度(32-bit)组成)浮点元素)从 a 进入内存.mem_addr 必须对齐在 16 字节 ..
发布时间:2021-08-27 19:48:04 C/C++开发

使用 intel Intrinsics 赋值 - 水平添加

我想总结一个大向量 ary 的所有元素.我的想法是用横向总和来做. const int simd_width = 16/sizeof(float);浮动助手[simd_width];//取前4个元素const __m128 a4 = _mm_load_ps(ary);for(int i=0; i 我寻找了一种方法,通过该方法,我可以将结果向量直接分配给四边形 a4,就像 _mm_store ..
发布时间:2021-08-27 19:47:58 C/C++开发

将 __m128i 中的每个 DW 右移不同的量

我想将 __m128i 寄存器的每个元素右移不同的量.我知道如果我们想像下面这样左移,我知道这是可能的: __m128i mul_constant = _mm_set_epi32(8, 4, 2, 1);__m128i left_vshift = _mm_mullo_epi32(R, mul_constant); 但是,如果我们想把它右移,有什么解决办法? 解决方案 我终于做到了如下: ..
发布时间:2021-08-27 19:47:55 其他开发

如何将向量中的值相互添加

在我的代码中我解决了积分 y=x^2-4x+6 我使用了 SSE - 它允许我一次操作 4 个值.我编写了一个程序,用 0 到 5 的值将这个积分分解为五个 4 元素向量 n1、n2、n3、n4. .datan1: .float 0.3125,0.625,0.9375,1.25n2: .float 1.5625,1.875,2.1875,2.5n3:.float 2.8125,3.12500 ..
发布时间:2021-08-27 19:47:52 其他开发

有人可以解释这个 SSE BigNum 比较吗?

如果你看看这个 answer,作者设法为存储在 2 个 SSE 寄存器中的 2 个整数 bignum 创建了一个紧凑的比较算法.我没有很好地遵循它:) 到目前为止我做了什么: if l = a 和 e = a == b = {a[i] == b[i] ?〜0:0} 然后 a 但这似乎不是作者在做什么.我错过了什么?有什么需要大于比较的? 解决方案 我忽略了答案不是通用 ..
发布时间:2021-08-27 19:47:49 其他开发

乘法使用 SSE (x*x*x)+(y*y*y)

我正在尝试使用 SIMD 优化此功能,但我不知道从哪里开始. long sum(int x,int y){返回 x*x*x+y*y*y;} 反汇编后的函数如下所示: 4007a0: 48 89 f2 mov %rsi,%rdx4007a3: 48 89 f8 mov %rdi,%rax4007a6: 48 0f af d6 imul %rsi,%rdx4007aa: 48 0f af c7 ..
发布时间:2021-08-27 19:47:46 其他开发

SSE2 双倍乘法比标准乘法慢

我想知道为什么以下带有 SSE2 指令的代码执行乘法的速度比标准 C++ 实现慢.代码如下: m_win = (double*)_aligned_malloc(size*sizeof(double), 16);__m128d* pData = (__m128d*)input().data;__m128d* pWin = (__m128d*)m_win;__m128d* pOut = (__m1 ..
发布时间:2021-08-27 19:47:44 C/C++开发

_mm_ 类型函数的等效 C 代码

克服_mm_store_ps、_mm_add_ps等__函数的简单等效C代码是什么.请通过具有等效C代码的示例指定任何函数. 为什么使用这些函数? 解决方案 根据您之前的类似问题,您似乎在尝试解决错误的问题.您有一些用于人脸检测的现有 SSE 代码,该代码正在崩溃,因为您将未对齐的数据传递给需要 16 字节对齐数据的 SSE 例程.在之前的问题中,人们曾告诉过您如何修复这种错位(在 Wi ..
发布时间:2021-08-27 19:47:41 其他开发

如何使用_mm_extract_epi8 函数?

我正在使用 _mm_extract_epi8 (__m128i a, const int imm8) 函数,该函数具有 const int 参数.当我编译此 C++ 代码时,收到以下错误消息: 错误 C2057 预期常量表达式 __m128i a;for (int i=0; i 如何在循环中使用这个函数? 解决方案 首先,即使有可能,您也不希望在循环中使用它,并且您不想完全展开循 ..
发布时间:2021-08-27 19:47:37 C/C++开发

sse2 指令集未启用

CC=g++CFLAGS=-O3 -c -WallDFLAGS=-g -WallLDFLAGS= -lz -lm -lpthreadKSWSOURCE=ksw.cALGNSOURCES=main.cpp aligner.cpp graph.cpp readfl.cpp hash.cpp form.cpp btree.cpp conLSH.cppINDSOURCES=whash.cpp genhas ..
发布时间:2021-08-27 19:47:34 其他开发

可以使用输入寄存器寻址输出 SIMD 寄存器

是否可以使用输入向量的标量值来索引输出向量?我尝试在 SIMD 中实现以下功能,但找不到任何解决方案. void shuffle(unsigned char * a,//输入一个unsigned char * r){//输出 r对于 (i=0; i 输入/输出向量示例如下 unsigned char * a = {0, 0, 0, 10, 0, 0, 0, 2, 0, 0, 0, 0, ..
发布时间:2021-08-27 19:47:30 C/C++开发

为什么我的 SSE 代码比本地 C++ 代码慢?

首先,我是 SSE 的新手.我决定加速我的代码,但它似乎比我的本机代码运行得更慢. 这是一个计算平方和的例子.在我的 Intel i7-6700HQ 上,本机代码需要 0.43 秒,SSE 需要 0.52.那么,瓶颈在哪里? inline float squared_sum(const float x, const float y){返回 x * x + y * y;}#define US ..
发布时间:2021-08-27 19:47:25 C/C++开发

如何在不使用寄存器的情况下将 128 位 xmm 直接移动到内存中?

我已经完成了 movdqu [dst], xmm0 但我不断收到错误,但是这是有效的: mov esi, dstmovdqu [esi], xmm0 这是为什么?以及如何使用直接内存写入? 谢谢. 解决方案 如果你想把从地址 dst 开始的 128 位内存移动到 xmm0 你可以在 MASM 中执行以下操作.(自 1990 年代初以来,我就没有使用过 MASM,但据我所知,这应该 ..
发布时间:2021-08-27 19:47:21 其他开发

使用 SIMD 右移 32 位压缩负数

我正在编写一些 SSE/AVX 代码,并且有一项任务是将打包的有符号 32 位整数除以 2 的补码.当值为正时,此移位工作正常,但由于符号位移位,它会为负值产生错误结果. 是否有任何 SIMD 操作可以让我移动保留符号位的位置?谢谢 解决方案 SSE2/AVX2 可以选择算术1 与 16 位和 32 位元素大小的逻辑右移.(对于 64 位元素,在 AVX512 之前只有逻辑可用). ..
发布时间:2021-08-27 19:47:17 其他开发

在 x86-SSE 中将四个压缩单精度浮点转换为无符号双字

有没有办法在带有 SSE 扩展的 x86 中将四个打包的单精度浮点值转换为四个双字?最接近的指令是CVTPS2PI,但它不能在两个xmm 寄存器上执行,而应以CVTPS2PI MM, XMM/M64 的形式给出.如果我想要类似 的东西怎么办?XMM, XMM/M128? 谢谢.伊曼. 解决方案 x86 没有对 FPunsigned 的原生支 ..
发布时间:2021-08-27 19:47:14 其他开发

是否可以使用 SSE 对嵌套进行矢量化?

我从来没有为 SSE 优化编写过汇编代码,如果这是一个菜鸟问题,很抱歉.在 this 中解释了如何矢量化 for 带有条件语句.但是,我的代码(取自 here )的形式如下: for (int j=-halfHeight; j(y,x) + wx * im.at(y,x+1)) +(wy) * ((1.0f - wx) * im.at(y+1,x) + wx * im.at(y+1,x+1)) ..
发布时间:2021-08-27 19:47:11 C/C++开发