sse相关内容

我需要在 2021 年使用 _mm256_zeroupper 吗?

摘自 Agner Fog 的“用 C++ 优化软件": 在某些 Intel 上混合使用和不使用 AVX 支持编译的代码时出现问题处理器.从 AVX 代码到非 AVX 代码会导致性能下降因为 YMM 寄存器状态发生了变化.应该通过调用来避免这种惩罚从 AVX 代码到非 AVX 代码的任何转换之前的内在函数 _mm256_zeroupper().在以下情况下,这可能是必要的: • 如果程序 ..
发布时间:2021-08-27 19:47:05 C/C++开发

使用 SSE 计算 4d 向量平均值

我尝试加速计算放置在数组中的 4d 向量的平均值.这是我的代码: #include #include #include #include #include #include typedef 浮点 [4];#define N 1000000双gettime(){struct timeval 电视;gettimeofday(&tv, 0);返回 (double)tv.tv_sec + (0.0000 ..
发布时间:2021-08-27 19:47:02 其他开发

使用 sse 内在函数时如何中断循环?

__m128* pSrc1 = (__m128*) 字符串;__m128 m0 = _mm_set_ps1(0);//空字符同时(1){__m128 结果 = __m128 _mm_cmpeq_ss(*pSrc1, m0);//如果字符是\0则中断//在这里做一些事情pSrc1++;} 我有一个字符串,其长度可以是 16 的倍数.如果 _mm_cmpeq_ss 返回相等,我该如何跳出循环? ..
发布时间:2021-08-27 19:46:58 其他开发

SIMD:位包有符号整数

无符号整数可以通过使用“位打包"进行压缩技术:在无符号整数块内仅存储有效位,当块中的所有整数都为“小"时导致数据压缩.该方法称为 FOR(参考框架). 有 SIMD 库可以非常有效地执行此操作. 现在我想使用类似 FOR 的技术来编码 signed 整数,例如来自未排序的无符号整数的差分序列.每个有符号整数的符号都需要存储在某处,有两种选择: 将标志存储在单独的数据块中.这会增加 ..
发布时间:2021-08-27 19:46:55 其他开发

SSE2 按矢量移位

我一直在尝试在 SSE2 内在函数中通过向量实现移位,但是通过实验和 intel 内在指南,它似乎只使用向量的最低有效部分. 重新表述我的问题,给定一个向量 {v1, v2, ..., vn} 和一组移位 {s1, s2, ..., sn},我如何计算结果 {r1, r2,..., rn} 使得: r1 = v1 ..
发布时间:2021-08-27 19:46:48 C/C++开发

任何种子的同一字符串上的 CRC32 哈希冲突

我试图找到种子来散列最大可能长度的小写字母短字符串而不会发生冲突.我选择了 SSE 4.2 CRC32 来简化任务.对于长度为 4、5、6 的种子,在一些合理的小值内不会发生碰撞(我不能无限等待). #include #include #include #include #include 静态 std::bitset::max()) + 1>哈希值;静态无效 findSeed(){uint8_t ..
发布时间:2021-08-27 19:46:45 C/C++开发

获取完整整数乘法的高半部分和低半部分

我从三个值 A、B、C(无符号 32 位整数)开始.而且我必须获得两个值 D、E(也是无符号 32 位整数).哪里 D = high(A*C);E = 低(A*C)+ 高(B*C); 我希望两个 32 位 uint 相乘会产生 64 位结果.“高"和“低"只是我对 64 位乘法结果中前 32 位和后 32 位标记的约定. 我尝试获得一些已经可用的优化代码.我在巨大的循环中有一小部分代码, ..
发布时间:2021-08-27 19:46:42 C/C++开发

计算大CRC32的正确方法是什么

这里是一篇介绍如何使用现代 x86-64 处理器中的内置 CRC32 指令计算最大 1024 字节的 CRC32.但是,我需要计算超过 1024 个字节的 CRC32.计算每个 1024 字节块的 CRC32 并最终将它们相加是一种正确的方法,还是不正确?如果是这样,正确的做法是什么? 解决方案 不,只是添加不能解决问题. 您链接的文章告诉我们如何操作: 一次计算的 CRC 输 ..
发布时间:2021-08-27 19:46:39 其他开发

为什么和在何处 align 16 用于指令的 SSE 对齐?

我正在阅读 Apress 的现代 x86 汇编语言书籍.对于编程 64 位 SSE 示例,作者将 align 16 放在代码中的特定点上.例如 .codeImageUint8ToFloat_ proc 帧_CreateFrame U2F_,0,64 ;帮助宏来创建序言_SaveXmmRegs xmm10,xmm11,xmm12,xmm13 ;帮助宏来创建序言_EndProlog ;帮助宏来创建 ..
发布时间:2021-08-27 19:46:37 其他开发

SSE 错误 - 使用 m128i_i32 定义 __m128i 变量的字段

以这种方式定义 __m128i 变量后: __m128i a;a.m128i_i32[0] = 65000; 我收到以下错误: 错误:请求'a'中的成员'm128i_i32',这是非类输入‘__m128i {aka __vector(2) long long int}’ a.m128i_i32[0] =65000; 我已经包含了以下头文件: #include #include # ..
发布时间:2021-08-27 19:46:34 C/C++开发

SSE:如何将 _m128i._i32[4] 减少到 _m128i._i8

我对 SSE 非常陌生 - 编码:我想将 int32 类型的 _m128i[4] 的结果存储到一个 int8 类型的 _m128i.(_m128i[j]._i32[k] 的值都在 (-127 和 + 127 ) 之间 我认为伪代码如下: result._i8 = {vec1._i8[0], vec1._i8[4], vec1._i8[8], vec1._i8[12],vec2._i8[0 ..
发布时间:2021-08-27 19:46:31 C/C++开发

在混合上下文中选择 SSE 指令执行域

我正在使用一些 SSE 汇编代码,其中没有足够的 xmm 寄存器来同时将所有临时结果和有用的常量保存在寄存器中. 作为一种变通方法,对于一些具有相同分量的常量向量,我将几个向量“压缩"到一个 xmm 寄存器中,如下所示的 xmm14.我使用 pshufd 指令来解压我需要的常量向量.这条指令有一点延迟,但由于它需要一个源寄存器和一个目标寄存器,否则非常方便: …Lfour_15_9:.lo ..
发布时间:2021-08-27 19:46:28 其他开发

使用 SIMD 解交织半字节向量

我有一个由 16384 个带符号的四位整数组成的输入向量.它们被打包成 8192 字节.我需要交错这些值并将其解压缩为两个单独数组中的有符号 8 位整数. a,b,c,d 是 4 位值. A、B、C、D 是 8 位值. 输入 = [ab,cd,...] Out_1 = [A,C, ...] Out_2 = [B,D, ...] 我可以很容易地用 C++ 做到这一点. co ..
发布时间:2021-08-27 19:46:25 C/C++开发

在 SIMD 操作的上下文中,非打包指令和打包指令有什么区别?

在 SIMD 操作的上下文中,非压缩指令和压缩指令有什么区别? 我正在阅读一篇关于优化 SSE 代码的文章: http://www.cortstratton.org/articles/OptimizingForSSE.php#batch 当我阅读时出现了这个问题 “作为一个额外的好处,movss 是一个非打包指令,它使我们能够更好地利用并行指令解码器.." 那有什么区 ..
发布时间:2021-08-27 19:46:22 其他开发

SIMD 行列式计算

是否存在一种计算低维(约 4)矩阵行列式的方法,该方法适用于 SIMD(霓虹灯、SSE、SSE2)?我正在使用手动膨胀公式,但效果不佳.我在 linux 下一直使用 SSE 到 SSE3 和霓虹灯.矩阵元素都是浮点数. 解决方案 这是我的 5 美分. 2x2 矩阵的行列式: 这是给读者的练习,应该很容易实现 3x3 矩阵的行列式: 使用标量三重积.这将需要智能的 c ..
发布时间:2021-08-27 19:46:19 其他开发

如果数据已经在缓存中,非临时存储会发生什么?

当您使用非临时存储时,例如movntq,并且数据已经在缓存中,存储会更新缓存而不是写入内存吗?或者它会更新缓存行并将其写出,驱逐它?或者什么? 这是一个有趣的困境.假设线程 A 正在加载包含 x 和 y 的缓存行.线程 B 使用 NT 存储写入 x.线程 A 写入 y.如果 B 对 x 的存储可以在 A 的加载发生时传输到内存,那么这里就会发生数据竞争.如果 A 看到 x 的旧值,但 X 的 ..
发布时间:2021-08-27 19:46:16 C/C++开发

计算大点积的最快方法是什么?

考虑这个片段: double dot(double* a, double* b, int n) {双和 = 0;for (int i = 0; i 如何使用内在函数或汇编程序加快速度? 注意事项: 您可以采用最新的架构,包括 AVX 扩展. n 是几百个. dot 本身将被紧密循环使用 解决方案 这是一个简单的 SSE 实现: #include "pmmintrin ..
发布时间:2021-08-27 19:46:11 其他开发

在 SSE 寄存器中混洗偶数和奇数值

我加载了两个具有 16 位值的 SSE 128 位寄存器.值按以下顺序排列: src[0] = [E_3, O_3, E_2, O_2, E_1, O_1, E_0, O_0]src[1] = [E_7, O_7, E_6, O_6, E_5, O_5, E_4, O_4] 我想要实现的是这样的订单: src[0] = [E_7, E_6, E_5, E_4, E_3, E_2, E_1, ..
发布时间:2021-08-27 19:46:07 其他开发