simd相关内容

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

使用AVX内部函数在__m512i中求和8位整数

AVX512为我们提供了用于对 __ mm512 向量中的所有单元格求和的内在函数.但是,它们中的一些对应项丢失了:还没有 _mm512_reduce_add_epi8 . _mm512_reduce_add_ps//16个浮点数的水平和_mm512_reduce_add_pd//8个双打的水平和_mm512_reduce_add_epi32//16个32位整数的水平和_mm512_reduc ..
发布时间:2021-04-12 20:53:24 其他开发

在16位字中仅保留10个有用位

我有_m256i个向量,这些向量在16位整数内包含10位字(因此16 * 16位仅包含16 * 10个有用位).最好/最快的方法是仅提取那些10位并打包以产生10位值的输出位流? 解决方案 这是我的尝试. 尚未进行基准测试,但我认为它总体上应该可以很快运行:指令太多,在现代处理器上所有指令都有1个延迟周期.存储也很有效,有2条存储指令可存储20个字节的数据. 该代码仅使用3个常 ..
发布时间:2021-04-12 20:53:16 其他开发

用霓虹灯内在函数代替memcpy

我试图通过编写相同的霓虹灯内在函数来击败"memcpy"功能.以下是我的逻辑: uint8_t * m_input;//大小为400 x300uint8_t * m_output;//大小为400 x300//没有提及用于创建内存的完整代码库memcpy(m_output,m_input,sizeof(m_output [0])* 300 * 400); 霓虹灯: int32_t ht ..
发布时间:2021-04-09 19:26:16 其他开发

_m_empty和_mm_empty有什么区别?

当我在寻找MMX功能时,我注意到其中两个_m_empty和_mm_empty具有那么为什么它们都存在?其中一个比另一个大吗?有手册中没有提到的区别吗? 解决方案 在文档中应指出差异. MSDN 更精确.他们明确提到了这一点: _mm_empty 的同义词是 _m_empty . ..
发布时间:2020-11-30 04:54:24 其他开发

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

使用C#Vector< T> SIMD查找匹配元素的索引

使用C#的Vector,我们如何最有效地向量化查找集合中特定元素的索引的操作? 作为约束,集合将始终是整数基元的Span,并且最多包含1个匹配元素. 我想出了一个看起来还不错的解决方案,但是我很好奇我们能否做得更好.方法是: 在每个插槽中创建一个仅包含目标元素的Vector. 在输入集向量和上一步中的向量之间使用Vector.Equals(),以得到一个掩码, ..
发布时间:2020-11-30 04:48:42 C#/.NET

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

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

SIMD内部函数参考手册/教程?

我正在研究使用它们来提高某些代码的性能,但是似乎很难找到* mmintrin.h标头中定义的函数的好的文档,有人可以向我提供有关这些信息的指针吗? 编辑:对如何入门非常基础的教程特别感兴趣. 解决方案 可在Intel Intrinsics Guide . com/en-us/articles/intel-intrinsics-guide"rel =" noreferrer“> htt ..
发布时间:2020-11-30 04:46:24 其他开发

C ++ SSE SIMD框架

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