avx2相关内容

如何对32位整数进行vblend?或:为什么没有_mm256_blendv_epi32?

我正在使用AVX2 x86 256位SIMD扩展.我想明智地执行32位整数分量if-then-else指令.在英特尔文档中,这样的指令称为vblend. 英特尔内部指南包含函数_mm256_blendv_epi8.此功能几乎可以满足我的需求.唯一的问题是它可以与8位整数一起使用.不幸的是,文档中没有_mm256_blendv_epi32.我的第一个问题是:为什么不存在此功能?我的第二个问题是 ..
发布时间:2020-11-30 04:54:28 C/C++开发

将int64_t移到AVX2 __m256i向量的高四倍数

这个问题类似于[1].但是,我不太了解它是如何解决使用GPR插入到ymm的高倍数的.另外,我希望该操作不使用任何中间内存访问. 可以使用AVX2或更低版本(我没有AVX512)吗? [1] 解决方案 我的回答没有显示出这样做的方法,因为如果没有AVX512F进行掩蔽广播(例如, vpbroadcastq zmm0{k1}, rax).但是使用暂存寄存器实际上并没有那么糟糕,它的成本与 ..
发布时间:2020-11-30 04:46:18 C/C++开发

将__m256i存储为整数

如何将__m256i数据类型存储为整数? 我知道对于花车来说: _mm256_store_ps(float *a, __m256 b) 第一个参数是输出数组. 对于仅发现的整数: _mm256_store_si256(__m256i *a, __m256i b) 其中两个参数均为__m256i数据类型. 做这样的事情够了吗 int * X = (int* ..
发布时间:2020-11-30 04:40:39 其他开发

在函数调用之前保存XMM寄存器

在汇编函数调用之前是否需要将任何XMM寄存器保存/推入堆栈? 因为我正在使用发布模式进行64位开发(使用AVX2)时在我的代码中观察到崩溃问题.在调试模式下,它的工作正常.我尝试保存XMM8寄存器的内容,并在函数调用结束时将其恢复,然后其工作正常. 有任何想法或参考吗? 解决方案 是的,在Microsoft Windows上,您需要保留XMM6-XMM15寄存器.请参阅 http:/ ..
发布时间:2020-11-29 20:12:53 其他开发

如何将两个SSE寄存器加在一起

我有两个SSE寄存器(128位是一个寄存器),我想将它们加起来.我知道如何在其中添加相应的单词,例如,如果我在寄存器中使用16位单词,则可以使用_mm_add_epi16做到这一点,但是我想要的是类似_mm_add_epi128的东西(不存在),它将使用寄存器作为一个大词. 即使需要多个指令,也可以执行任何操作吗? 我当时正在考虑使用_mm_add_epi64,检测右字中的溢出,然后根据需要在寄 ..
发布时间:2020-11-29 20:04:33 C/C++开发

在较高的优化级别上,AVX2 simd相对于标量的性能相对较差

我正在学习和使用SIMD函数,并编写了一个简单的程序,该程序将其可以在 1秒中运行的向量加法指令的数量与普通标量加法进行了比较. 我发现SIMD在较低的优化级别上表现相对较好,而在较高的优化级别上则始终表现较差,并且我想知道原因,我同时使用了MSVC和gcc,这是同一回事.以下结果来自 Ryzen 7 CPU.我也在 Intel 平台上进行了测试,也几乎是相同的故事. #include ..
发布时间:2020-11-13 00:02:23 C/C++开发

GCC 5和更高版本中对AVX2的支持

我写了下面的"T"类来加速对 使用AVX2的“字符集".然后我发现它在 gcc 5和更高版本,当我使用"-O3"时. 谁能帮我追溯到一些编程结构, 已知在最新的编译器/系统上不起作用? 此代码的工作方式:基础结构("_bits")是一个256字节的块(已为AVX2对齐并分配),可以将其作为char [256]或AVX2元素进行访问,具体取决于元素是否为访问或整个操作都在矢量操作中使用.似乎它 ..
发布时间:2020-11-12 23:33:54 C/C++开发

如何使用此宏测试内存是否对齐?

我是simd初学者,已经阅读这篇关于该主题的文章(因为我使用的是AVX2兼容机)。 现在,我已经读过这个问题,以检查您的指针是否对齐。 我正在对此进行测试玩具示例 main.cpp : #include #include #定义is_aligned(POINTER,BYTE_COUNT)\ ((((uintptr_t ..
发布时间:2020-09-27 18:58:35 C/C++开发

avx2寄存器位反转

在avx2寄存器中是否存在(快速)执行32bit int值反转的位的方法? 例如 _mm256_set1_epi32(2732370386); // binary:101000101101110010101001110100100 => 1001011100101010011101101000101 //寄存器包含1268071237,这是1001011100 ..
发布时间:2020-09-27 02:00:37 C/C++开发

最快的跨度3收集指令顺序是什么?

问题: 从内存生成第3步32位元素聚集的最有效序列是什么? 如果内存的排列方式为: MEM = R0 G0 B0 R1 G1 B1 R2 G2 B2 R3 G3 B3。 .. 我们要获得三个YMM寄存器,其中: YMM0 = R0 R1 R2 R3 R4 R5 R6 R7 YMM1 = G0 G1 G2 G3 G4 G5 G6 G7 YMM2 = ..
发布时间:2020-09-27 01:09:50 C/C++开发

将__m256i的前N个或后N个位设置为1,其余为0的有效方法

如何使用AVX2有效设置为1 第一个N位 最后N位 中的 ,将其余部分设置为0? 当范围可能在__m256i值的中间开始和结束时,这是2个单独的操作,用于位范围的尾部和头部.范围内全部__m256i值的部分都使用all- 0或all- 1掩码进行处理. 解决方案 AVX2移位指令vpsllvd和vpsrlvd具有移位计数的不错的属性 大于或等于32会导致ymm寄存器中 ..
发布时间:2020-09-21 05:24:12 C/C++开发

如何使用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. ..
发布时间:2020-09-21 05:15:23 其他开发

如何从__m64值的lsb创建8位掩码?

我有一个用例,其中我有一个位数组,例如,每个位都表示为8位整数.uint8_t data[] = {0,1,0,1,0,1,0,1};我想通过仅提取每个值的lsb来创建一个整数.我知道使用int _mm_movemask_pi8 (__m64 a)函数可以创建掩码,但是此内在函数仅占用字节的msb而不是lsb.是否有类似的内在方法或有效方法来提取lsb以创建单个8位整数? 解决方案 没有直 ..
发布时间:2020-09-15 05:50:55 C/C++开发

运行基本的Avx512代码时获取非法指令

我正在尝试学习AVX指令,并且在运行我收到的基本代码时 非法指令(核心已转储) 下面提到了代码,我正在使用 对其进行编译 g ++ -mavx512f 1.cpp 究竟是什么问题,以及如何解决? 谢谢! #include #include using namespace std; void add(const flo ..
发布时间:2020-09-15 05:48:31 C/C++开发

在AVX2中重现_mm256_sllv_epi16和_mm256_sllv_epi8

我很惊讶地发现_mm256_sllv_epi16/8(__m256i v1, __m256i v2)和_mm256_srlv_epi16/8(__m256i v1, __m256i v2)不在“>英特尔中《内部功能指南》 ,但我找不到任何解决方案可以仅使用AVX2来重新创建该AVX512内部功能. 此函数向左移动所有打包的int 16/8bits int v2中相应数据元素的计数值. ..
发布时间:2020-09-15 05:48:09 C/C++开发

将两个32位整数的向量相乘,生成一个32位结果元素的向量

将两个_mm256i寄存器的每个32位条目彼此相乘​​的最佳方法是什么? _mm256_mul_epu32不是我想要的,因为它会产生64位输出.我希望每个32位输入元素都具有32位结果. 此外,我确定两个32位值的乘法不会溢出. 谢谢! 解决方案 您需要_mm256_mullo_epi32()内在函数.摘自Intel出色的在线内在函数指南: 简介 __m256 ..
发布时间:2020-09-15 05:45:57 其他开发

测试AVX寄存器是否包含相等的整数

考虑一个包含四个64位整数的256位寄存器. 在AVX/AVX2中是否可以有效地测试其中一些整数是否相等? 例如: a){43, 17, 25, 8}:结果必须为false,因为4个数字中没有2个相等. b){47, 17, 23, 17}:结果必须为'true',因为数字17在AVX向量寄存器中出现了2次. 如果可能的话,我想用C ++做到这一点,但是如果需要的话,我可以 ..
发布时间:2020-09-15 05:45:51 C/C++开发

AVX或SSE上的水平尾随最大值

我有一个由16位值组成的__m256i寄存器,我想获取每个尾随元素的最大值为零. 举个例子: input: 1 0 0 3 0 0 4 5 0 0 0 0 4 3 0 2 output: 1 1 1 3 3 3 4 5 5 5 5 5 4 3 3 2 在AVX或AVX架构上是否有任何有效的方法?也许log(16)= 4次迭代? 添加: 对于其中包含8个uint_16的128 ..
发布时间:2020-09-15 05:44:33 其他开发