avx相关内容

AVX性能对于按位XOR运算和POP计数较慢

我对编写一些基于AVX内部函数的代码是新手,所以需要一些帮助来理解我的观察结果。我有两个实现距离计算的方法,这两个方法都接受2个浮点数组及其维度,并返回一个浮点距离。第一种方法计算欧几里得距离 static float compute_l2Square(const void *pVect1v, const void *pVect2v, const void *qty_ptr) ..
发布时间:2022-08-17 19:03:27 其他开发

Vzeroall零寄存器是否为ymm16到ymm31?

vzeroall的documentation似乎不一致。这篇散文说: 该指令将所有XMM或YMM寄存器的内容置零。 然而,下面的伪代码表示在64位模式下,只有寄存器ymm0到ymm15受到影响: IF (64-bit mode) limit ←15 ELSE limit ← 7 FOR i in 0 .. limit: simd_reg_file[i][M ..
发布时间:2022-08-15 14:48:18 其他开发

Yasm:vmovaps指令导致分段错误

问题:movaps出现分段错误。 上下文:x86-64指令vmovaps旨在与Core I系列处理器(我正在运行此系统)上的AVX寄存器一起使用。AVX寄存器的宽度是SSE寄存器的两倍(分别为256位和128位)。指令vmovaps应将对齐的浮点值(32位)向量移入指定的ymm寄存器。 可能的原因:源数据的对齐特别重要,因为不正确对齐的数据是分段错误的来源。然而,即使我已经对齐了我的数 ..
发布时间:2022-04-06 11:09:13 其他开发

g++-4.8 中缺少 AVX 日志内在函数 (_mm256_log_ps)?

我正在尝试在我的代码中使用一些 AVX 内在函数,但遇到了对数内在函数的障碍. 使用适用于 Linux 的英特尔内部指南 v3.0.1,我看到内部 _mm256_log_ps(__m256) 被列为“immintrin.h"的一部分,并且在我当前的架构中也受支持. 但是,尝试编译这个简单的测试用例失败并显示“错误:'_mm256_log_ps' 未在此范围内声明" 示例使用g++ ..
发布时间:2022-01-23 20:52:36 C/C++开发

如何在 GCC 中以 32 字节边界对齐堆栈?

我正在为 Windows 64 位目标使用基于 GCC 4.6.1 的 MinGW64 构建.我正在玩新的英特尔 AVX 指令.我的命令行参数是 -march=corei7-avx -mtune=corei7-avx -mavx. 但是在堆栈上分配局部变量时,我开始遇到分段错误错误.GCC使用对齐的移动VMOVAPS和VMOVAPD来移动__m256和__m256d,这些指令需要32字节结盟 ..
发布时间:2022-01-22 12:22:43 其他开发

使用 AVX 一次性完成 4 个水平双精度求和

问题可以描述如下. 输入 __m256d a, b, c, d 输出 __m256d s = {a[0]+a[1]+a[2]+a[3], b[0]+b[1]+b[2]+b[3],c[0]+c[1]+c[2]+c[3], d[0]+d[1]+d[2]+d[3]} 到目前为止我所做的工作 这似乎很容易:两个 VHADD 之间有一些改组,但实际上结合 AVX 所具有的所有排列不能生成 ..
发布时间:2022-01-09 16:34:01 其他开发

Simd matmul 程序给出不同的数值结果

我正在尝试使用 simd 内在函数在 C 中编写矩阵乘法.我很确定我的实现,但是当我执行时,从结果矩阵系数的第 5 位开始出现一些数值错误. REAL_T 只是一个带有 typedef 的浮点数 /* 这是我的带有 simd 的 matmul 版本,使用浮动简单精度*/void matmul(int n, REAL_T *A, REAL_T *B, REAL_T *C){整数 i,j,k; ..
发布时间:2022-01-09 10:18:47 其他开发

使用 AVX 指令进行水平向量求和的最快方法

我有一个包含四个 64 位浮点值的压缩向量. 我想得到向量元素的总和. 使用 SSE(并使用 32 位浮点数),我可以执行以下操作: v_sum = _mm_hadd_ps(v_sum, v_sum);v_sum = _mm_hadd_ps(v_sum, v_sum); 不幸的是,尽管 AVX 具有 _mm256_hadd_pd 指令,但它的结果与 SSE 版本不同.我相信这是因为大多 ..
发布时间:2022-01-06 12:54:15 其他开发

将 32 位解包为 32 字节 SIMD 向量的最快方法

将 32 位存储在内存中的 uint32_t 中,将每一位解包到 AVX 寄存器的单独字节元素的最快方法是什么?这些位可以位于各自字节内的任何位置. 编辑:澄清一下,我的意思是位 0 到字节 0,位 1 到字节 1.显然字节中的所有其他位都为零.目前我能做的最好的是 2 PSHUFB 并且每个位置都有一个掩码寄存器. 如果uint32_t是位图,那么对应的向量元素应该是0或非0.(也就 ..
发布时间:2022-01-06 12:47:06 其他开发

使用 AVX 最快实现指数函数

我正在寻找在 AVX 元素(单精度浮点)上运行的指数函数的有效(快速)近似.即 - __m256 _mm256_exp_ps( __m256 x ) 没有 SVML. 相对准确度应该类似于 ~1e-6 或 ~20 个尾数位(2^20 中的 1 部分). 如果它是用英特尔内在函数以 C 风格编写的,我会很高兴. 代码应该是可移植的(Windows、macOS、Linux、MSVC、IC ..
发布时间:2022-01-06 12:36:09 其他开发

如何执行_mm256_movemask_epi8 (VPMOVMSKB) 的逆运算?

内在: int 掩码 = _mm256_movemask_epi8(__m256i s1) 创建一个掩码,其32 位对应于s1 的每个字节的最高有效位.使用位操作(例如BMI2)操作掩码后,我想执行_mm256_movemask_epi8 的逆操作,即创建一个__m256i 向量每个字节的最高有效位包含 uint32_t 掩码 的相应位. 最好的方法是什么? 编辑:我需要执行相反的 ..
发布时间:2022-01-06 12:27:45 其他开发

intel avx2 中是否有与 movemask 指令相反的指令?

movemask 指令采用 __m256i 并返回一个 int32,其中每一位(前 4、8 或所有 32 位,取决于输入向量元素类型)是相应向量元素的最高有效位. 我想做相反的事情:取 32(其中只有 4、8 或 32 个最低有效位有意义),并获得 __m256i,其中设置了每个 int8、int32 或 int64 大小的块的最高有效位到原来的位. 基本上,我想从一个压缩的位掩码变成 ..
发布时间:2022-01-06 12:15:58 其他开发

使用 openmp 并行 for 循环获得出乎意料的良好性能

我在之前的评论(尤其是@Zboson)之后编辑了我的问题以提高可读性 我一直遵循并观察到传统观点,即 openmp 线程的数量应该与机器上的超线程数量大致匹配,以获得最佳性能.然而,我在我的新笔记本电脑上观察到了奇怪的行为,它配备了英特尔酷睿 i7 4960HQ,4 核 - 8 线程.(请参阅此处的英特尔文档) 这是我的测试代码: #include #include #include ..
发布时间:2021-12-30 21:14:46 其他开发

AVX 标量操作要快得多

我测试了下面的简单函数 void mul(double *a, double *b) {for (int i = 0; i 具有非常大的数组,因此它受内存带宽限制.我使用的测试代码如下.当我用 -O2 编译时,它需要 1.7 秒.当我用 -O2 -mavx 编译时,它只需要 1.0 秒.非 vex 编码的标量操作慢 70%!这是为什么? 这是-O2 和-O2 -mavx 的程序集. 的 ..
发布时间:2021-12-21 10:14:11 其他开发

从两个数组的点积测量内存带宽

两个数组的点积 for(int i=0; i 不重用数据,因此它应该是内存绑定操作.因此,我应该可以通过点积来衡量内存带宽. 使用代码在why-vectorizing-the-loop-does-not-have-performance-improvement 我的系统获得了 9.3 GB/s 的带宽.但是,当我尝试使用点积计算带宽时,我获得了单线程速率的两倍多,多线程速率的三倍多(我的 ..
发布时间:2021-12-21 09:56:26 C/C++开发