sse相关内容

SSE 乘法 16 x uint8_t

我想用 SSE4 乘以具有 16 个无符号 8 位整数的 __m128i 对象,但我只能找到一个用于乘以 16 位整数的内在函数.有没有_mm_mult_epi8之类的东西? 解决方案 MMX/SSE/AVX 中没有 8 位乘法.但是,您可以使用 16 位乘法来模拟 8 位乘法内在函数,如下所示: 内联 __m128i _mm_mullo_epi8(__m128i a, __m128i ..
发布时间:2021-08-27 19:45:01 其他开发

如何将两个 __m128 值组合为 __m256?

我想将两个 __m128 值合并为一个 __m256. 像这样: __m128 a = _mm_set_ps(1, 2, 3, 4);__m128 b = _mm_set_ps(5, 6, 7, 8); 类似于: __m256 c = { 1, 2, 3, 4, 5, 6, 7, 8 }; 是否有任何内在函数可用于执行此操作? 解决方案 这应该可以满足您的需求: __m12 ..
发布时间:2021-08-27 19:44:59 其他开发

SSE 比较返回 NAN 的向量

我正在尝试这样的事情: __m128 cA = _mm_set_ps1(-2.0f);__m128 cB = _mm_set_ps1(2.0f);__m128 df = _mm_cmpgt_ps(cA, cB); 在这种情况下 df 返回零. 但如果我这样做: __m128 cA = _mm_set_ps1(2.0f);__m128 cB = _mm_set_ps1(-2.0f);__ ..
发布时间:2021-08-27 19:44:56 其他开发

使用 SSE 时性能变差(整数数组的简单加法)

我正在尝试使用 SSE 内在函数来添加两个 32 位有符号整数数组.但与线性加法相比,我的性能非常差. 平台 - Intel Core i3 550、GCC 4.4.3、Ubuntu 10.04(有点旧,是的) #define ITER 1000typedef union sint4_u {__m128i v;sint32_t x[4];} sint4; 功能: void 计算(sin ..
发布时间:2021-08-27 19:44:53 其他开发

使用 SSE 对数,还是切换到 FPU?

我正在做一些统计计算.我需要它们很快,所以我重写了大部分以使用 SSE.我对它很陌生,所以我想知道这里的正确方法是什么: 据我所知,SSE 中没有 log2 或 ln 函数,至少没有达到 4.1,这是我使用的硬件支持的最新版本. 是否更好: 提取 4 个浮点数,并对它们进行 FPU 计算以确定熵 - 我不需要将这些值中的任何一个加载回 SSE 寄存器,只需将它们与另一个浮点数相加 ..
发布时间:2021-08-27 19:44:50 其他开发

SSE 内在函数:将 32 位浮点数转换为 UNSIGNED 8 位整数

使用 SSE 内在函数,我得到了一个包含四个 32 位浮点数的向量,该向量被限制在 0-255 的范围内并四舍五入到最接近的整数.我现在想把这四个写成字节. 有一个内在的 _mm_cvtps_pi8 可以将 32 位转换为 8 位 signed int,但问题是任何超过 127 的值都会被限制为 127.我找不到任何可以限制为无符号 8 位值的指令. 我有一种直觉,我可能想要做的是 _ ..
发布时间:2021-08-27 19:44:47 其他开发

SSE:_mm_load/store 与使用直接指针访问的区别

假设我要添加两个缓冲区并存储结果.两个缓冲区都已分配为 16 字节对齐.我找到了两个如何做到这一点的例子. 第一个是使用 _mm_load 将数据从缓冲区读取到 SSE 寄存器中,执行加法操作并存储回结果寄存器.直到现在我都会这样做. void _add( uint16_t * dst, uint16_t const * src, size_t n ){for( uint16_t cons ..
发布时间:2021-08-27 19:44:44 其他开发

如何比较 __m128 类型?

__m128 a;__m128 b; 如何编码a != b ? 使用什么:_mm_cmpneq_ps 或 _mm_cmpneq_ss ? 如何处理结果? 找不到足够的文档. 解决方案 您可能应该使用 _mm_cmpneq_ps.但是,SIMD 代码与标量代码的比较解释略有不同.你想测试 any 对应的元素不相等吗?还是所有对应的元素不相等? 要测试 _mm_cmp ..
发布时间:2021-08-27 19:44:41 其他开发

将分散索引转换为聚集索引的有效方法?

我正在尝试使用 SIMD 内在函数编写流压缩(采用数组并去除空元素).循环的每次迭代一次处理 8 个元素(SIMD 宽度). 使用 SSE 内在函数,我可以使用 _mm_shuffle_epi8() 相当有效地执行此操作,它执行 16 个条目表查找(收集并行计算术语).shuffle 索引是预先计算好的,并使用位掩码查找. for (i = 0; i 我的问题是现在我也想为 Altiv ..
发布时间:2021-08-27 19:44:36 其他开发

英特尔 SSE:为什么 `_mm_extract_ps` 返回 `int` 而不是 `float`?

为什么 _mm_extract_ps 返回的是 int 而不是 float? 从 C 中的 XMM 寄存器读取单个 float 的正确方法是什么? 或者更确切地说,一种不同的提问方式是:_mm_set_ps 指令的反面是什么? 解决方案 来自 MSDN 文档,我相信您可以将结果转换为浮点数. 注意他们的例子,0xc0a40000 值等价于 -5.125 (a.m128_f ..
发布时间:2021-08-27 19:44:33 其他开发

如何使用 SSE 执行 uint32/float 转换?

在 SSE 中有一个函数 _mm_cvtepi32_ps(__m128i input) 它接受 32 位宽有符号整数 (int32_t) 的输入向量并将它们转换为 floats. 现在,我想将输入整数解释为未签名.但是没有函数 _mm_cvtepu32_ps 并且我找不到一个实现.你知道我在哪里可以找到这样的函数或者至少给出一个实现的提示吗?为了说明结果的差异: unsigned int ..
发布时间:2021-08-27 19:44:30 其他开发

测试两个 __m128i 变量之间的相等性

如果我想在两个 __m128i 变量之间进行按位相等测试,我需要使用 SSE 指令还是可以使用 ==?如果不是,我应该使用哪个 SSE 指令? 解决方案 虽然使用 _mm_movemask_epi8 是一种解决方案,但如果您的处理器采用 SSE4.1 我认为更好的解决方案是使用指令它在 FLAGS 寄存器中设置零或进位标志.这可以节省test 或 cmp 指令. 要做到这一点,你可以 ..
发布时间:2021-08-27 19:44:27 其他开发

SSE:将短整数转换为浮点数

我想使用 SSE 将一组无符号短数转换为浮点数.说吧 __m128i xVal;//有 8 个 16 位无符号整数__m128 y1, y2;//2 个 xmm 寄存器,用于 8 个浮点值 我想要 y1 中的前 4 个 uint16 &y2 中的下一个 4 uint16.需要知道使用哪个 sse 内在的. 解决方案 您需要先将 8 x 16 位无符号短整型向量解包为两个 32 位无符号 ..
发布时间:2021-08-27 19:44:24 其他开发

使用AVX2收集指令时的加载地址计算

查看 AVX2 内部函数文档,那里收集了一些加载指令,例如 VPGATHERDD: __m128i _mm_i32gather_epi32 (int const * base, __m128i index, const int scale); 我从文档中不清楚计算出的加载地址是元素地址还是字节地址,即元素i: load_addr = base + index[i] * scale;//(1) ..
发布时间:2021-08-27 19:44:20 其他开发

使用 SSE 计算绝对值的最快方法

我知道有 3 种方法,但据我所知,一般只使用前 2 种: 使用 andps 或 andnotps 屏蔽符号位. 优点:如果掩码已在寄存器中,则是一条快速指令,非常适合在循环中多次执行此操作. 缺点:掩码可能不在寄存器中或更糟,甚至不在缓存中,从而导致非常长的内存提取. 将值从零减去求反,然后得到原值的最大值并求反. 优点:固定成本,因为不需要获取任何东西,例如面具. 缺 ..
发布时间:2021-08-27 19:44:17 其他开发

如何为我的独立可启动代码启用 SSE?

(这个问题最初是关于 CVTSI2SD 指令的,事实上我认为它在 Pentium M CPU 上不起作用,但实际上是因为我使用的是自定义操作系统,我需要手动启用 SSE.) 我有一个 Pentium M CPU 和一个定制的操作系统,到目前为止没有使用过 SSE 指令,但我现在需要使用它们. 尝试执行任何 SSE 指令都会导致中断 6,非法操作码(在 Linux 中会导致 SIGILL ..
发布时间:2021-08-27 19:44:13 其他开发

SIMD 编程语言

在过去的几年里,我一直在做大量的 SIMD 编程,而且大部分时间我一直依赖编译器的内在函数(例如用于 SSE 编程的那些)或编程汇编来获得真正漂亮的东西.然而,到目前为止,我几乎找不到任何内置支持 SIMD 的编程语言. 现在显然有一些着色器语言,例如 HLSL、Cg 和 GLSL,它们对这类东西有本机支持,但是,我正在寻找至少能够在没有自动向量化的情况下编译为 SSE 但具有内置支持的东西 ..
发布时间:2021-06-21 20:22:18 其他开发

取消引用 XMM 寄存器中的指针(收集)

如果我将一些指针或类似指针的值打包到 SSE 或 AVX 寄存器中,是否有任何特别有效的方法将它们取消引用,进入另一个这样的寄存器?(“特别高效"的意思是“比仅使用内存存储值更高效".)有没有任何方法可以在不将寄存器的中间副本写入内存的情况下取消对它们的引用? 编辑澄清:这意味着,假设 32 位指针和 SSE,使用 XMM 寄存器的四个部分一次索引到四个任意内存区域,并将四个结果一次返回到另 ..
发布时间:2021-06-18 19:59:42 其他开发

用 SIMD 指令重写 memcpy/memcmp/... 有意义吗?

在大型软件中用 SIMD 指令重写 memcpy/memcmp/... 有意义吗? 如果是这样,为什么 GCC 默认不为这些库函数生成 SIMD 指令? 另外,SIMD还有什么可以改进的功能吗? 解决方案 是的,使用 SSE 指令,这些函数的速度要快得多.如果您的运行时库/编译器内在包含优化版本就好了,但这似乎并不普遍. 我有一个自定义 SIMD memchr,它比库版本 ..
发布时间:2021-06-15 19:20:34 其他开发