avx2相关内容

从AVX寄存器中提取并存储交替的低32位

我有一个__m256i寄存器,我想从每个64位组中提取4个低32位,将它们打包并连续存储到内存中。即,如果__m256i寄存器包含8个32位字:{a0,a1,a2,a3,a4,a5,a6,a7},我希望将四个字{a0,a2,a4,a6}连续存储到存储器 我编写了以下代码: void mystore(uint32 *dst, const __m256i& src) { __m ..
发布时间:2022-03-16 23:42:56 其他开发

自动向量化比较

我在将g++5.4用于比较时遇到问题。基本上,我想使用向量化比较4个无符号整数。我的第一个方法是直截了当的: bool compare(unsigned int const pX[4]) { bool c1 = (temp[0] ..
发布时间:2022-03-16 23:31:56 C/C++开发

在 AVX2 中高效实现 log2(__m256d)

SVML 的 __m256d _mm256_log2_pd (__m256d a) 在 Intel 以外的其他编译器上不可用,并且他们说它的性能在 AMD 处理器上受到限制.AVX中提到了互联网上的一些实现g++-4.8 中缺少日志内在函数 (_mm256_log_ps)? 和 SIMD 数学SSE 和 AVX 的库,但它们似乎比 AVX2 更 SSE.还有 Agner Fog 的向量库 ,但是它 ..
发布时间:2022-01-09 10:06:21 C/C++开发

将 __m256i 存储为整数

如何将 __m256i 数据类型存储为整数? 我知道对于花车有: _mm256_store_ps(float *a, __m256 b) 其中第一个参数是输出数组. 对于我只找到的整数: _mm256_store_si256(__m256i *a, __m256i b) 其中两个参数都是 __m256i 数据类型. 做这样的事情就足够了: int * X = (int* ..
发布时间:2022-01-06 13:07:28 其他开发

我可以使用 AVX FMA 单元进行位精确 52 位整数乘法吗?

AXV2 没有任何大于 32 位源的整数乘法.它确实提供 32 x 32 -> 32 乘法,以及 32 x 32 -> 64 乘以1,但没有 64 位来源. 假设我需要一个输入大于 32 位但小于或等于 52 位的无符号乘法 - 我可以简单地使用浮点数 DP 乘法 或 FMA 指令,当整数输入和结果可以用 52 位或更少位表示时(即在范围内),输出是否为位精确[0, 2^52-1])? ..
发布时间:2022-01-06 12:54:49 其他开发

将 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 其他开发

如何使用 x86 SIMD 有效地将 8 位位图转换为 0/1 整数数组

我想将 8 位整数转换为大小为 8 的数组,每个值都包含一个整数的位值. 例如:我有 int8_t x = 8; 我想把它转换成 int8_t array_x = {0,0,0,0,1,0,0,0}; 这必须有效地完成,因为此计算是信号处理块的一部分.有没有一种有效的方法来做到这一点?我确实检查了混合说明.当数组元素大小为 8 位时,它不符合我的要求.开发平台为AMD Ryzen. ..
发布时间:2022-01-06 12:32:10 其他开发

如何执行_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 其他开发

AVX2 中的 VPERMB 在哪里?

AVX2 有很多好东西.例如,它有很多指令,它们比它们的前身更强大.以 VPERMD 为例:它允许您完全任意广播/将一个 256 位长的 32 位值向量混洗/置换到另一个向量中,在运行时可选择置换1.从功能上讲,这淘汰了大量现有的旧解包、广播、置换、洗牌和移位指令3. 酷豆. 那么 VPERMB 在哪里?即,相同的指令,但处理字节大小的元素.或者,就此而言,对于 16 位元素,VPER ..
发布时间:2021-12-18 09:30:52 其他开发

使用 AVX-512 或 AVX-2 对大数据计算 1 位(人口计数)

我有一大块内存,比如 256 KiB 或更长.我想计算整个块中 1 位的数量,或者换句话说:将所有字节的“人口计数"值相加. 我知道 AVX-512 有一个 VPOPCNTDQ 指令计算 512 位向量内每个连续 64 位中 1 位的数量,并且 IIANM 应该可以在每个周期发出其中一个(如果有合适的 SIMD 向量寄存器可用) - 但我没有任何经验编写 SIMD 代码(我更像是一个 GPU ..
发布时间:2021-12-18 09:23:52 其他开发

AVX2中log2(__m256d)的高效实现

SVML 的 __m256d _mm256_log2_pd (__m256d a) 在 Intel 之外的其他编译器上不可用,他们说它的性能在 AMD 处理器上有缺陷.AVX 中提到了互联网上的一些实现g++-4.8 中缺少日志内在函数 (_mm256_log_ps)? 和 SIMD 数学SSE 和 AVX 的库,但是它们似乎比 AVX2 更 SSE.还有 Agner Fog 的矢量库 ,但它是一 ..
发布时间:2021-12-06 19:45:01 C/C++开发

使用 AVX2 将 2 个 32 位数字相乘并取前 32 位

我使用乘法(加上其他运算)作为整数除法的替代.我的解决方案最终要求我将 2 个 32 位数字相乘并取前 32 位(就像 mulhi 函数一样),但 AVX2 不提供 _mm256_mulhi_epu16 的 32 位变体(例如:没有 '_mm256_mulhi_epu32' 函数). 我尝试了各种方法,例如检查AVX512的功能,甚至将32位整数操纵为2 hi/lo 16位整数.我对使用低级 ..
发布时间:2021-09-29 19:41:03 其他开发

AVX2 列人口计数算法分别针对每个位列

对于我正在进行的项目,我需要计算翻录的 PDF 图像数据中每列的设置位数. 我正在尝试获取整个 PDF 作业(所有页面)中每一列的总设置位数. 数据一旦被翻录,就会存储在一个 MemoryMappedFile 中,没有后备文件(在内存中). PDF 页面尺寸为 13952 像素 x 15125 像素.可以通过将 PDF 的长度(高度)(以像素为单位)乘以以字节为单位的宽度来计算所 ..
发布时间:2021-09-18 18:56:29 C/C++开发

/arch:AVX 是否启用 AVX2?

我找不到这个简单问题的答案,/arch:AVX 是否在 Visual Studio 2012 Update 4 上启用 AVX2 及其花哨的 256 位寄存器? 思路: 是的,它启用了 AVX,因为 VS 没有提到 AVX2.但我认为 VS 可以做 AVX2,因为我的内在工作. 不,不是,因为 SSE 和 SSE2 是分开的 解决方案 它指的是 AVX 而不是 AVX2. ..
发布时间:2021-09-17 19:17:09 C/C++开发

SIMD:位包有符号整数

无符号整数可以通过使用“位打包"进行压缩技术:在无符号整数块内仅存储有效位,当块中的所有整数都为“小"时导致数据压缩.该方法称为 FOR(参考框架). 有 SIMD 库可以非常有效地执行此操作. 现在我想使用类似 FOR 的技术来编码 signed 整数,例如来自未排序的无符号整数的差分序列.每个有符号整数的符号都需要存储在某处,有两种选择: 将标志存储在单独的数据块中.这会增加 ..
发布时间:2021-08-27 19:46:55 其他开发