sse相关内容
我正在寻找有效的方法来计算以下函数: 输入: __ m128i数据,uint8_t输入; 输出:布尔值,指示 data 中的任何字节是否在 in 中. 我实际上是在使用它们为容量为8的字节实现时空有效的堆栈.我最有效的解决方案是首先计算一个 __ m128i tmp ,所有字节均作为 in .然后检查 tmp \ xor数据中的任何字节是否为零字节. 解决方案 是的,AV
..
我目前正在使用SSE和AVX内部函数编写矢量化版本的QR分解(线性系统求解器).子步骤之一需要选择与另一个值相反/相等的值的符号.在串行版本中,我为此使用了std :: copysign.现在,我想为SSE /AVX寄存器创建一个类似的功能.不幸的是,STL为此使用了内置函数,因此我不能只复制代码并将其转换为SSE /AVX指令. 我还没有尝试过(所以现在没有代码可显示),但是我的简
..
因此,AVX具有 immintrin.h 中的功能,该功能应允许将两个 __ m128i 值的串联存储到单个 __ m256i 中价值.功能是 __ m256i _mm256_set_m128i(__ m128i嗨,__ m128i lo) 但是,当我使用它时,就像这样: __ m256i as [2];__m128i s [4];as [0] = _mm256_setr_m128i(
..
使用像Intel optane DCPMM这样的永久性内存时,如果在执行movnt指令时系统崩溃(断电),重启后是否有可能看到部分结果? 针对: 4或8字节的 movnti ,x86可以保证原子用于其他目的吗? 16字节SSE movntdq / movntps 不能保证是原子的,但实际上可能在支持持久性内存的CPU上. 32字节AVX vmovntdq / vmovntps 6
..
我已经分解了一个用MSVC v140编译的小型C ++程序,并试图估计每条指令的周期,以便更好地了解代码设计如何影响性能.我一直在“面向数据的设计和C ++" 上关注Mike Acton的CppCon 2014演讲,特别是我链接到的部分. 他在其中指出了以下几行: movss 8(%rbx),%xmm1movss 12(%rbx),%xmm0 然后,他声称这些 2 x 32位读取可能
..
Intel的本指南说: __m128i _mm_i32gather_epi32 (int const* base_addr, __m128i vindex, const int scale) 并且: 说明 使用32位索引从内存中收集32位整数. 32位 元素从从base_addr开始的地址加载,并且偏移量为 vindex中的每个32位元素(每个索引均按 规模).收集的元素将合
..
我们有固有的_mm_storeu_ps可以将__m128存储到一个浮点数组中.但是,我看不到任何等效的整数.我期待的是类似_mm_storeu_epi32的东西,但是那不存在.那么,将_m128i存储到int数组中的方式是什么? 解决方案 其名称为
..
我想使用SSE内在函数翻译这段代码. for (uint32_t i = 0; i > 16) & 0xFFFF) | (value
..
我正在使用AVX2 x86 256位SIMD扩展.我想明智地执行32位整数分量if-then-else指令.在英特尔文档中,这样的指令称为vblend. 英特尔内部指南包含函数_mm256_blendv_epi8.此功能几乎可以满足我的需求.唯一的问题是它可以与8位整数一起使用.不幸的是,文档中没有_mm256_blendv_epi32.我的第一个问题是:为什么不存在此功能?我的第二个问题是
..
如何使用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
..
假设我有一个__m128i,其中包含4个32位整数值. 是否可以通过某种方式将其存储在char[4]内,其中每个int值的低位字符都存储在char值中? 所需结果: r1 r2 r3 r4 __m128i 0x00000012 0x00000034 0x00000056 0x00000078
..
《英特尔内在函数指南》仅声明_mm512_load_epi32: 将512位(由16个压缩的32位整数组成)从内存加载到dst 和_mm512_load_si512: 将512位整数数据从内存加载到dst 这两者之间有什么区别?文档不清楚. 解决方案 没有区别,只是愚蠢的冗余命名.为清楚起见,请使用_mm512_load_si512.谢谢,英特尔.像往常一样,更容易
..
假设我有两个向量,分别由两个类型为double的数组表示,每个数组的大小为2.我想添加相应的位置.因此,假设向量i0和i1,我想将i0[0] + i1[0]和i0[1] + i1[1]加在一起. 因为类型是double,所以我需要两个寄存器.诀窍是将i0[0]和i1[0]以及i0[1]和i1[1]放入另一个,然后将寄存器本身添加进去. 我的问题是,如果我依次调用_mm_load_ps(
..
我有以下代码来找到最大值 int length = 2000; float *data; // data is allocated and initialized float max = 0.0; for(int i = 0; i max) { max = data; } } 我曾尝试使用SSE3
..
我已经开始使用SSE优化代码.本质上,它是一个光线跟踪器,通过将坐标存储在__m128数据类型x,y,z(四根射线的坐标按轴分组)中,一次处理四根射线.但是我有一个分支语句,可以防止被零除,但我似乎无法转换为SSE.依次为: const float d = wZ == -1.0f ? 1.0f/( 1.0f-wZ) : 1.0f/(1.0f+wZ); 其中wZ是z坐标,并且需要对所有四条
..
我正在MSDN上阅读此内容,并且上面写着 您不应直接访问__m128i字段.但是,您可以在调试器中查看这些类型. __m128i类型的变量映射到XMM [0-7]寄存器. 但是,它没有解释原因.为什么?例如,以下是“坏": void func(unsigned short x, unsigned short y) { __m128i a; a.m128i_i64[
..
我使用SIMD指令运行一系列计算.这些指令返回一个16字节的向量,结果为compare,每个字节为0x00或0xff: 0 1 2 3 4 5 6 7 15 16 compare : 0x00 0x00 0x00 0x00 0xff 0x00 0x00 0x00 ... 0xff 0x00 将字节设置为0
..
在实现SIMD支持时,我正在阅读英特尔的内在指南.我有些困惑,我的问题如下. __m128 _mm_cmpeq_ps (__m128 a, __m128 b)文档说,它用于比较压缩的单精度浮点数. “打包"是什么意思?在使用浮点值之前,是否需要进行打包? 对于双精度,有类似_mm_cmpeq_sd的内在函数,这意味着比较“较低"的双精度浮点元素.上下双精度元素是什么意思?是否可以使用它
..
有人知道开源C ++ x86 SIMD内部函数库吗? 英特尔在其集成的性能基元库中提供了我所需要的,但是由于遍布各地的版权,我无法使用它. 编辑 我已经知道编译器提供的内在函数.我需要一个方便的界面来使用它们. 解决方案 看看 libsimdpp 仅标头的C ++ SIMD包装器图书馆. 该库通过单个接口支持多个指令集:SSE2,SSE3,SSSE3,SSE4.1,
..
我最近一直在使用SSE固有的int _mm_extract_epi8 (__m128i src, const int ndx),根据参考文献“从索引选择的压缩整数数组元素中提取整数字节".这正是我想要的. 但是,我通过_m128i上的_mm_cmpestri确定索引,该索引执行具有显式长度的字符串数据的打包比较并生成索引.该索引的范围是0..16,其中0..15表示有效索引,而16表示未找到
..