simd相关内容

所有64位Intel架构都支持SSSE3 / SSE4.1 / SSE4.2指令吗?

我确实在网上和英特尔软件手册上进行了搜索。但是无法确认所有Intel 64架构是否都支持最高SSSE3或最高SSE4.1或最高SSE4.2或AVX等。这样,我便可以在程序中使用最低限度的SIMD支持的指令。 解决方案 仅授权x64本机(AMD64或Intel 64)处理器支持SSE和SSE2。 SSE3受Intel Pentium 4处理器(“ Prescott”),AMD Athl ..
发布时间:2020-10-11 00:01:46 其他开发

Constexpr和SSE内在函数

大多数C ++编译器均支持 _mm_cmpeq_epi32 我的问题是此函数未标记为 constexpr ,尽管“从语义上讲”,因为它是一个纯函数,所以没有理由不将该函数设为 constexpr 。 是否存在我可以通过任何方式编写自己的版本(例如) _mm_cmpeq_epi32 就是 constexpr 吗? 很显然,我希望运行时的函数使用正确的as ..
发布时间:2020-10-08 18:32:33 C/C++开发

数据对齐以实现矢量化/高效的缓存访问

这本书中的内容如下: 对于Knights Landing,当数据以$ b $开始时,内存移动是最佳的b地址位于64字节边界上。 Q1。有没有一种方法可以动态地用C ++代码查询处理器,以了解对于当前正在运行应用程序的处理器,最佳的 n 字节边界是什么?这样,代码就可以移植了。 该书进一步指出: 作为程序员,我们最终要完成两项工作:(1)对齐我们的数据,(2)确保 确保编译 ..

编译器是否将SSE指令用于常规C代码?

我看到人们默认使用 -msse -msse2 -mfpmath = sse 标志,希望这会提高性能。我知道在C代码中使用特殊的向量类型时,SSE会参与其中。但是这些标志对常规C代码有什么区别吗? 解决方案 是的,如果您使用完全优化进行编译,现代编译器会使用SSE2自动矢量化。 即使在-O1或-Os上,编译器也将使用SIMD加载/存储指令来复制或初始化结构或其他对象的宽度大于整数寄存器 ..
发布时间:2020-10-06 20:38:12 其他开发

向量化clang中的函数

我正在根据此 clang参考文献使用clang对以下函数进行矢量化。它需要一个字节数组向量,并根据此RFC 应用掩码。 静态无效apply_mask(vector& payload,uint8_t(& masking_key)[4]){ #pragma clang loop vectorize (enable)交错(enable) for(size_t i = 0; ..
发布时间:2020-10-01 23:01:23 C/C++开发

clang扩展向量的三元运算符

我尝试过使用clang的扩展向量。三元运算符应该工作,但对我来说不工作。示例: int main() { 使用int4 = int __attribute __((ext_vector_type(4) )); int4 a {0,1,3,4}; int4 b {2,1,4,5}; auto const r(a-b?a:b); 返回0; } 请 ..
发布时间:2020-10-01 22:18:54 C/C++开发

在constexpr评估上分支/在constexpr上重载

设置: 我有一个使用SIMD内部函数的函数,想在某些constexpr函数中使用它。 为此,我需要将其设为constexpr。但是,SIMD内部函数未标记为constexpr,并且编译器的常量评估器无法处理它们。 我尝试用功能相同的C ++ constexpr实现替换SIMD内在函数。该函数在运行时变慢了3.5倍,但是我可以在编译时使用它(是吗?)。 问题 >: 如何 ..
发布时间:2020-09-28 00:57:12 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++开发

我如何使用SVML指令

我正在尝试使用SIMD计算指数函数。并且我找到了此功能: https://software.intel。 com / sites / landingpage / IntrinsicsGuide /#text = _mm_exp_ps& expand = 2136 我已经包含了“ immintrin.h” 在我的代码中,而且我的cpu也有 SSE 标志。但是 gcc 抱怨在此范围内未声明 er ..
发布时间:2020-09-27 00:02:15 C/C++开发

SSE减少浮点向量

如何使用sse内在函数获取浮点向量的求和元素(归约)? 简单的序列号: void(float * input,float& result,unsigned int NumElems) { 结果= 0; for(auto i = 0; i ..
发布时间:2020-09-26 23:00:15 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++开发

用另一个替换一个字节

对于这个看似简单的问题,我很难创建代码. 给出一个压缩的8位整数,用一个字节替换另一个字节(如果存在). 例如,我想将0x06替换为0x01,因此我可以使用res作为输入来查找0x06: // Bytes to be manipulated res = _mm_set_epi8(0x00, 0x03, 0x02, 0x06, 0x0F, 0x02, 0x02, 0x06, 0x0 ..
发布时间:2020-09-15 05:49:52 其他开发

使用SIMD指令时,为什么此简单的C ++ SIMD基准测试运行速度较慢?

我正在考虑编写SIMD向量数学库,因此,作为一个快速的基准测试,我编写了一个程序,该程序进行1亿个(按4个浮点数)矢量逐元素乘法,并将它们相加在一起.对于我的经典非SIMD变体,我只是制作了一个具有4个浮点数的结构,并编写了自己的乘法函数"multiplyTwo",该函数将两个这样的结构元素明智地相乘,然后返回另一个结构.对于我的SIMD版本,我使用了"immintrin.h"以及__m128,_ ..
发布时间:2020-09-15 05:49:49 C/C++开发

调度SIMD指令+ SIMDPP + qmake

我正在开发一个使用SIMD指令集的QT小部件.我已经编译了3个版本:SSE3,AVX和AVX2(simdpp允许通过单个#define在它们之间进行切换). 现在,我想要的是让窗口小部件根据最佳支持的指令集在这些实现之间自动切换. simdpp随附的指南利用了一些makefile魔术: CXXFLAGS="" test: main.o test_sse2.o test_sse3.o ..
发布时间:2020-09-15 05:49:47 C/C++开发