sse相关内容
SSE2 有在单精度浮点数和 32 位整数之间转换向量的指令. _mm_cvtps_epi32() _mm_cvtepi32_ps() 但是没有双精度和 64 位整数的等价物.换句话说,它们不见了: _mm_cvtpd_epi64() _mm_cvtepi64_pd() AVX 好像也没有. 模拟这些内在函数的最有效方法是什么? 解决方案 在 AVX512
..
我有 16 字节的“字符串"(它们可能更短,但您可能会假设它们在末尾用零填充),但您可能不会假设它们是 16 字节对齐的(至少并非总是如此). 如何编写一个例程将它们(相等)与 SSE 内在函数进行比较?我发现此代码片段可能会有所帮助,但我不确定它是否合适? 注册__m128i xmm0, xmm1;注册 unsigned int eax;xmm0 = _mm_load_epi128((_
..
我正在将 SSE2 移植到 NEON.该端口处于早期阶段,并且产生不正确的结果.结果不正确的部分原因是 _mm_shuffle_epi32 和我选择的 NEON 指令. _mm_shuffle_epi32 的文档来自 微软.Intel 文档更好,但我不清楚一些伪代码在做什么. SELECT4(src, control){案例(控制[1:0])0: tmp[31:0] := src[31:0
..
你可以用 SSE4.1 ptest 做什么其他比测试单个寄存器是否全为零? 您能否结合使用 SF 和 CF 来测试有关两个未知输入寄存器的任何有用信息? PTEST 有什么用?您认为检查打包比较的结果(如 PCMPEQD 或 CMPPS)会很好,但至少在英特尔 CPU 上,使用 PTEST + JCC 进行比较和分支比使用 PMOVMSK(B/PS/PD) + 宏融合 CMP 花费更多
..
我有兴趣在添加无符号 8 位整数时识别溢出值,并将结果限制为 0xFF: __m128i m1 = _mm_loadu_si128(/* 16 个 8 位无符号整数 */);__m128i m2 = _mm_loadu_si128(/* 16 个 8 位无符号整数 */);__m128i m3 = _mm_adds_epu8(m1, m2); 我有兴趣对“小于"进行比较在这些无符号整数上,类似
..
我正在查看英特尔数据表:英特尔® 64 和 IA-32 架构Software Developer's Manual 和我找不到 之间的区别 MOVDQA:移动对齐双四字 MOVAPS:移动对齐打包单精度 在英特尔数据表中,我可以找到这两个指令: 此指令可用于从 128 位内存位置,将 XMM 寄存器的内容存储到128 位内存位置,或在两个 XMM 寄存器之间移动数据. 唯一
..
我想详细了解如何使用 SSE. 除了显而易见的阅读英特尔® 64 和 IA-32 之外,还有哪些学习方法架构软件开发人员手册? 主要我有兴趣使用 GCC X86 内置函数. 解决方案 首先,我不建议使用内置函数 - 它们不可移植(跨同一架构的编译器). 使用 intrinsics、GCC 做得很好 将 SSE 内在函数优化为更优化的代码.您可以随时查看程序集,了解如何充分
..
总的来说,我认为我对延迟和吞吐量之间的区别有很好的理解.但是,对于英特尔 Intrinsics,我不清楚延迟对指令吞吐量的影响,尤其是在按顺序(或几乎按顺序)使用多个内部调用时. 例如,让我们考虑: _mm_cmpestrc 这在 Haswell 处理器上的延迟为 11,吞吐量为 7.如果我在循环中运行这条指令,我会在 11 个周期后获得一个连续的每个周期输出吗?由于这需要一次运行 11
..
我有一个包含四个 64 位浮点值的压缩向量. 我想得到向量元素的总和. 使用 SSE(并使用 32 位浮点数),我可以执行以下操作: v_sum = _mm_hadd_ps(v_sum, v_sum);v_sum = _mm_hadd_ps(v_sum, v_sum); 不幸的是,尽管 AVX 具有 _mm256_hadd_pd 指令,但它的结果与 SSE 版本不同.我相信这是因为大多
..
如何将 4 个 32 位整数乘以另外 4 个整数?我没有找到任何可以做到这一点的说明. 解决方案 如果您需要 signed 32x32 位整数乘法,则在 software.intel.com 看起来它应该做你想做的: 静态内联 __m128i muly(const __m128i &a, const __m128i &b){__m128i tmp1 = _mm_mul_epu32(a,b
..
我试图在 Intel i3 处理器上找到 32 个元素(每个 1 字节数据)的总和减少.我是这样做的: s=0;对于 (i=0; i 但是,它需要更多时间,因为我的应用程序是一个需要更少时间的实时应用程序.请注意,最终和可能超过 255. 有没有办法使用低级 SIMD SSE2 指令来实现这一点?不幸的是,我从未使用过 SSE.为此,我尝试搜索 sse2 函数,但它也不可用.是否(sse
..
我正在使用 AVX 一次计算八个点积.在我当前的代码中,我做这样的事情(展开之前): 常春藤桥/桑迪桥 __m256 areg0 = _mm256_set1_ps(a[m]);for(int i=0; i
..
哪些头文件为不同的 x86 SIMD 指令集扩展(MMX、SSE、AVX 等)提供了内在函数?在网上找不到这样的列表似乎是不可能的.如果我错了,请纠正我. 解决方案 现在你通常应该只包含 .它包括一切. GCC 和 clang 将阻止您将内部函数用于编译时未启用的指令(例如使用 -march=native 或 -mavx2 -mbmi2 -mpopcnt -mfma -mcx16-m
..
我想将 8 位整数转换为大小为 8 的数组,每个值都包含一个整数的位值. 例如:我有 int8_t x = 8; 我想把它转换成 int8_t array_x = {0,0,0,0,1,0,0,0}; 这必须有效地完成,因为此计算是信号处理块的一部分.有没有一种有效的方法来做到这一点?我确实检查了混合说明.当数组元素大小为 8 位时,它不符合我的要求.开发平台为AMD Ryzen.
..
我创建了一个使用 SIMD 将 64 位 * 64 位转换为 128 位的函数.目前我已经使用 SSE2(实际上是 SSE4.1)实现了它.这意味着它同时做两个 64b*64b 到 128b 的产品.相同的想法可以扩展到 AVX2 或 AVX512,同时提供四个或八个 64b*64 到 128b 产品.我的算法基于 http://www.hackersdelight.org/hdcodetxt/m
..
我想尝试使用 SIMD 指令编写 atoi 实现,以包含在 RapidJSON(C++ JSON读/写库).它目前在其他地方有一些 SSE2 和 SSE4.2 优化. 如果是速度增益,多个atoi结果可以并行完成.字符串最初来自 JSON 数据缓冲区,因此多 atoi 函数必须执行任何所需的 swizzling. 我想出的算法如下: 我可以用以下方式初始化一个长度为 N 的向量:
..
快速总结: 我有一个 24 位值的数组.关于如何将单个 24 位数组元素快速扩展为 32 位元素的任何建议? 详细信息: 我正在使用 DirectX 10 中的像素着色器实时处理传入的视频帧.一个绊脚石是我的帧来自具有 24 位像素(YUV 或 RGB 图像)的捕获硬件,但 DX10 需要32 位像素纹理.因此,我必须将 24 位值扩展为 32 位,然后才能将它们加载到 GPU
..
如果我在 VS 2013 Update 2 或 Update 3 中编译此代码:(以下来自 Update 3) #include "stdafx.h"#include #include 结构体缓冲区{长*数据;整数计数;};#ifndef 最大值#define max(a,b) (((a) > (b)) ? (a) : (b))#万一长代码(长*数据,整数计数){长 nMaxY = 数据 [0]
..
我正在尝试使用使用 SIMD 内在函数的 cmake 编译 C 程序.当我尝试编译它时,出现两个错误 /usr/lib/gcc/x86_64-linux-gnu/5/include/smmintrin.h:326:1: 错误:调用 always_inline '_mm_mullo_epi32' 时内联失败:目标特定选项错配_mm_mullo_epi32 (__m128i __X, __m12
..
使用过 NodeJS、Socket.io 问题 假设有 2 个用户 U1 &U2,通过 Socket.io 连接到应用程序.算法如下: U1 完全失去互联网连接(例如关闭互联网) U2 向 U1 发送消息. U1 尚未收到消息,因为 Internet 已关闭 服务器通过心跳超时检测到U1断开连接 U1 重新连接到 socket.io U1 从未收到来自 U2 的消
..