sse相关内容

使用SSE/AVX/AVX2检查__m128i的所有字节是否匹配单个字节

我正在寻找有效的方法来计算以下函数: 输入: __ m128i数据,uint8_t输入; 输出:布尔值,指示 data 中的任何字节是否在 in 中. 我实际上是在使用它们为容量为8的字节实现时空有效的堆栈.我最有效的解决方案是首先计算一个 __ m128i tmp ,所有字节均作为 in .然后检查 tmp \ xor数据中的任何字节是否为零字节. 解决方案 是的,AV ..
发布时间:2021-04-12 20:53:38 其他开发

编写std :: copysign的便携式SSE/AVX版本

我目前正在使用SSE和AVX内部函数编写矢量化版本的QR分解(线性系统求解器).子步骤之一需要选择与另一个值相反/相等的值的符号.在串行版本中,我为此使用了std :: copysign.现在,我想为SSE ​​/AVX寄存器创建一个类似的功能.不幸的是,STL为此使用了内置函数,因此我不能只复制代码并将其转换为SSE ​​/AVX指令. 我还没有尝试过(所以现在没有代码可显示),但是我的简 ..
发布时间:2021-04-12 20:53:35 C/C++开发

将__m256i设置为两个__m128i值的值

因此,AVX具有 immintrin.h 中的功能,该功能应允许将两个 __ m128i 值的串联存储到单个 __ m256i 中价值.功能是 __ m256i _mm256_set_m128i(__ m128i嗨,__ m128i lo) 但是,当我使用它时,就像这样: __ m256i as [2];__m128i s [4];as [0] = _mm256_setr_m128i( ..
发布时间:2021-04-12 20:53:29 其他开发

在x86-64上,是"movnti"或"movntdq".系统崩溃时的指令原子?

使用像Intel optane DCPMM这样的永久性内存时,如果在执行movnt指令时系统崩溃(断电),重启后是否有可能看到部分结果? 针对: 4或8字节的 movnti ,x86可以保证原子用于其他目的吗? 16字节SSE movntdq / movntps 不能保证是原子的,但实际上可能在支持持久性内存的CPU上. 32字节AVX vmovntdq / vmovntps 6 ..
发布时间:2021-04-12 19:21:46 其他开发

估算每条指令的周期

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

如何对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++开发

比较SSE Intrinsics中的符号位

如何使用SSE内在函数创建一个掩码,该掩码指示两个打包浮点数(__m128's)的符号是否相同,例如,如果比较a和b,其中a为[1.0 -1.0 0.0 2.0],b为[1.0 1.0 1.0 1.0]我们想要的蒙版是[true false true true]. 解决方案 这里是一种解决方案: const __m128i MASK = _mm_set1_epi32(0xffffff ..
发布时间:2020-11-30 04:52:20 C/C++开发

将4个SSE整数提取为4个字符

假设我有一个__m128i,其中包含4个32位整数值. 是否可以通过某种方式将其存储在char[4]内,其中每个int值的低位字符都存储在char值中? 所需结果: r1 r2 r3 r4 __m128i 0x00000012 0x00000034 0x00000056 0x00000078 ..
发布时间:2020-11-30 04:52:17 C/C++开发

_mm512_load_epi32和_mm512_load_si512有什么区别?

《英特尔内在函数指南》仅声明_mm512_load_epi32: 将512位(由16个压缩的32位整数组成)从内存加载到dst 和_mm512_load_si512: 将512位整数数据从内存加载到dst 这两者之间有什么区别?文档不清楚. 解决方案 没有区别,只是愚蠢的冗余命名.为清楚起见,请使用_mm512_load_si512.谢谢,英特尔.像往常一样,更容易 ..
发布时间:2020-11-30 04:52:11 其他开发

上证所新增中

假设我有两个向量,分别由两个类型为double的数组表示,每个数组的大小为2.我想添加相应的位置.因此,假设向量i0和i1,我想将i0[0] + i1[0]和i0[1] + i1[1]加在一起. 因为类型是double,所以我需要两个寄存器.诀窍是将i0[0]和i1[0]以及i0[1]和i1[1]放入另一个,然后将寄存器本身添加进去. 我的问题是,如果我依次调用_mm_load_ps( ..
发布时间:2020-11-30 04:52:04 其他开发

用于比较(_mm_cmpeq_ps)和分配操作的SSE内在函数

我已经开始使用SSE优化代码.本质上,它是一个光线跟踪器,通过将坐标存储在__m128数据类型x,y,z(四根射线的坐标按轴分组)中,一次处理四根射线.但是我有一个分支语句,可以防止被零除,但我似乎无法转换为SSE.依次为: const float d = wZ == -1.0f ? 1.0f/( 1.0f-wZ) : 1.0f/(1.0f+wZ); 其中wZ是z坐标,并且需要对所有四条 ..
发布时间:2020-11-30 04:49:57 C/C++开发

为什么不直接访问__m128i字段?

我正在MSDN上阅读此内容,并且上面写着 您不应直接访问__m128i字段.但是,您可以在调试器中查看这些类型. __m128i类型的变量映射到XMM [0-7]寄存器. 但是,它没有解释原因.为什么?例如,以下是“坏": void func(unsigned short x, unsigned short y) { __m128i a; a.m128i_i64[ ..
发布时间:2020-11-30 04:49:50 C/C++开发

SIMD和标量和标量双精度之间的区别

在实现SIMD支持时,我正在阅读英特尔的内在指南.我有些困惑,我的问题如下. __m128 _mm_cmpeq_ps (__m128 a, __m128 b)文档说,它用于比较压缩的单精度浮点数. “打包"是什么意思?在使用浮点值之前,是否需要进行打包? 对于双精度,有类似_mm_cmpeq_sd的内在函数,这意味着比较“较低"的双精度浮点元素.上下双精度元素是什么意思?是否可以使用它 ..
发布时间:2020-11-30 04:47:28 C/C++开发

C ++ SSE SIMD框架

有人知道开源C ++ x86 SIMD内部函数库吗? 英特尔在其集成的性能基元库中提供了我所需要的,但是由于遍布各地的版权,我无法使用它. 编辑 我已经知道编译器提供的内在函数.我需要一个方便的界面来使用它们. 解决方案 看看 libsimdpp 仅标头的C ++ SIMD包装器图书馆. 该库通过单个接口支持多个指令集:SSE2,SSE3,SSSE3,SSE4.1, ..
发布时间:2020-11-30 04:46:21 C/C++开发

_mm_extract_epi8(...)以非文字整数作为参数的内在函数

我最近一直在使用SSE固有的int _mm_extract_epi8 (__m128i src, const int ndx),根据参考文献“从索引选择的压缩整数数组元素中提取整数字节".这正是我想要的. 但是,我通过_m128i上的_mm_cmpestri确定索引,该索引执行具有显式长度的字符串数据的打包比较并生成索引.该索引的范围是0..16,其中0..15表示有效索引,而16表示未找到 ..
发布时间:2020-11-30 04:45:16 C/C++开发