sse相关内容

AVX2 什么是基于面具的最有效的打包方式?

如果您有一个输入数组和一个输出数组,但您只想编写那些满足特定条件的元素,那么在 AVX2 中最有效的方法是什么? 我在 SSE 看到它是这样完成的:(来自:https://deplinenoise.files.wordpress.com/2015/03/gdc2015_afredriksson_simd.pdf) __m128i LeftPack_SSSE3(__m128 掩码,__m12 ..
发布时间:2021-12-01 15:34:09 C/C++开发

SSE指令:哪些CPU可以做原子16B内存操作?

考虑 x86 CPU 上的单个内存访问(单个读取或单个写入,而不是读取 + 写入)SSE 指令.该指令正在访问 16 个字节(128 位)的内存,并且访问的内存位置对齐到 16 个字节. 文档“英特尔® 64 位架构内存订购白皮书"指出,对于“读取或写入地址在 8 字节边界上对齐的四字(8 字节)的指令",内存操作似乎作为单个内存执行访问与内存类型无关. 问题:是否存在 Intel/A ..
发布时间:2021-11-30 14:44:44 其他开发

动态生成向量常数的最佳指令序列是什么?

“最佳"意味着最少的指令(或最少的 uop,如果有任何指令解码为多个 uop).以字节为单位的机器代码大小是相等 insn 计数的决胜局. 常量代本质上是新依赖链的开始,因此延迟很重要是不寻常的.在循环内生成常量也是不常见的,因此吞吐量和执行端口需求也大多无关. 生成常量而不是加载它们需要更多的指令(​​全零或全一除外),因此它确实消耗了宝贵的 uop 缓存空间.这可能是比数据缓存更有 ..
发布时间:2021-11-30 11:13:57 其他开发

为什么 mulss 在 Haswell 上只需要 3 个周期,与 Agner 的指令表不同?(展开具有多个累加器的 FP 循环)

我是指令优化的新手. 我对一个简单的函数 dotp 进行了简单的分析,该函数用于获取两个浮点数组的点积. C 代码如下: float dotp(const float x[],const 浮动 y[],常量短 n){短我;浮苏马;苏马 = 0.0f;for(i=0; i 我使用了网络上 Agner Fog 提供的测试框架testp. 在这种情况下使用的数组是对齐的: int ..
发布时间:2021-11-30 11:06:51 其他开发

进行水平 SSE 向量求和(或其他缩减)的最快方法

给定一个包含三个(或四个)浮点数的向量.总结它们的最快方法是什么? SSE(movaps、shuffle、add、movd)总是比 x87 快吗?SSE3 中的水平添加指令值得吗? 转移到 FPU 的成本是多少,然后是 faddp,faddp?最快的特定指令序列是什么? “尝试安排事物以便您一次可以对四个向量求和"将不被接受作为答案.:-) 例如为了对数组求和,您可以使用多个向量 ..
发布时间:2021-11-30 11:04:46 其他开发

SSE、内在函数和对齐

我使用大量 SSE 编译器内在函数编写了一个 3D 矢量类.一切正常,直到我开始将具有 3D 矢量的类作为 new 的成员.我在发布模式下遇到了奇怪的崩溃,但在调试模式下则没有,反之亦然. 所以我阅读了一些文章并认为我也需要将拥有 3D 矢量类实例的类也对齐到 16 个字节.所以我只是在类前面添加了 _MM_ALIGN16 (__declspec(align(16)),如下所示: _MM_ ..
发布时间:2021-11-27 08:06:06 C/C++开发

如何在不使用寄存器的情况下将 128 位 xmm 直接移动到内存中?

我已经完成了 movdqu [dst], xmm0 但我不断收到错误,但是这有效: mov esi, dstmovdqu [esi], xmm0 这是为什么?以及如何使用直接内存写入? 谢谢. 解决方案 如果你想把从地址 dst 开始的 128 位内存移动到 xmm0 你可以在 MASM 中执行以下操作.(自 1990 年代初以来,我就没有使用过 MASM,但据我所知,这应该可行 ..
发布时间:2021-11-25 07:26:41 C#

为什么以及在何处使用 align 16 进行 SSE 对齐以获取指令?

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

SSE 优化的 64 位整数仿真

对于我正在从事的业余爱好项目,我需要在 x86 CPU 上模拟某些 64 位整数运算,并且它需要快速. 目前,我通过 MMX 指令执行此操作,但这确实很难处理,因为我必须一直刷新 fp 寄存器状态(并且因为大多数 MMX 指令处理 signed 整数,我需要无符号行为). 所以我想知道 SO 上的 SSE/优化专家是否可以使用 SSE 提出更好的实现. 我需要的操作如下(非常具体 ..
发布时间:2021-11-25 06:20:59 C#

如何在 MSVC 中有效地从两个 __m128d 转换为一个 __m128i?

转换然后移位然后按位或是从两个 __m128d 转换为单个 __m128i 的唯一方法吗? 这对于 x64 版本的 Xcode 来说是完全可以接受的 m128d v2dHi = ....m128d v2dLo = ....__m128i v4i = _mm_set_epi64(_mm_cvtpd_pi32(v2dHi), _mm_cvtpd_pi32(v2dLo)) 反汇编显示正在使用_ ..
发布时间:2021-11-25 06:14:11 C#

如何知道SSE2是否在opencv中被激活

我有一个版本的 OpenCV 2.4.10 库,它是为 Windows 上的 Intel X64 构建的. 我如何知道 CV_SSE2 是否处于活动状态?我没有代码.我只有库、DLL 和头文件. 谢谢 解决方案 您可以使用 checkHardwareSupport 像: #include #include int main(){cv::setUseOptimized(true ..
发布时间:2021-11-25 06:03:50 C#

.NET Core 中游戏开发的浮点确定性

背景 我们正在使用 C# 和 .NET Core 开发 RTS 游戏引擎.与大多数其他实时多人游戏不同,RTS 游戏倾向于通过将玩家输入同步到其他玩家,并同时在所有客户端上同步运行游戏模拟来工作.这要求游戏逻辑具有确定性,以免游戏不同步. 非确定性的一个潜在来源是浮点运算.从我收集到的主要问题是旧的 x87 FPU 指令 - 它们使用内部 80 位寄存器,而 IEEE-754 浮点值是 ..
发布时间:2021-11-24 17:10:04 C#

SSE 指令添加数组的所有元素

我是 SSE2 指令的新手.我找到了一个指令 _mm_add_epi8 可以添加两个数组元素.但我想要一个可以添加数组所有元素的 SSE 指令. 我试图用这段代码来发展这个概念: #include #include #include void sse(unsigned char* a,unsigned char* b);无效主(){/* 无符号字符 *arr;arr=(unsigned c ..
发布时间:2021-11-18 04:07:01 其他开发

ARM Neon:有条件的存储建议

我想弄清楚如何在 ARM neon 中生成条件存储.我想做的是相当于这个SSE指令: void _mm_maskmoveu_si128(__m128i d, __m128i n, char *p); which 有条件地存储d的字节元素到地址p.选择器n中每个字节的高位决定了d中对应的字节是否会被存储. 有关如何使用 NEON 内在函数执行此操作的任何建议?谢谢 这就是我所 ..
发布时间:2021-11-17 22:22:05 其他开发

使用 ARM NEON 内在函数对 cvtColor 进行 SIMD 优化

我正在研究 BGR 到灰度转换的 SIMD 优化,这相当于 OpenCV 的 cvtColor() 函数.这个函数有一个英特尔 SSE 版本,我指的是它.(我所做的基本上是将 SSE 代码转换为 NEON 代码.) 我快写完代码了,可以用g++编译了,但是还是无法得到正确的输出.有没有人知道错误可能是什么? 我得到了什么(不正确): 我应该得到什么: 这是我的代码: #i ..
发布时间:2021-11-17 22:09:55 其他开发

常见的 SIMD 技术

在哪里可以找到有关常见 SIMD 技巧的信息?我有一个指令集,知道如何编写简单的 SIMD 代码,但我知道,现在 SIMD 功能要强大得多.它可以容纳复杂的条件无分支代码. 例如 (ARMv6),以下指令序列将 Rd 的每个字节设置为 Ra 和 Rb 对应字节的无符号最小值: USUB8 Rd, Ra, RbSEL Rd、Rb、Ra 教程/不常见的 SIMD 技术的链接也很好:) ARMv6 ..
发布时间:2021-11-17 22:05:00 其他开发

NEON、SSE 和交错加载与洗牌

我正在尝试理解“Iwillnotexist Idonotexist"在使用 ARM NEON 内在函数对 cvtColor 进行 SIMD 优化的评论: ... 为什么不使用映射到 VLD3 指令的 ARM NEON 内部函数?这使您免于所有的改组,既简化又加速了代码.英特尔 SSE 实现需要 shuffle,因为它缺少 2/3/4 路解交错加载指令,但您不应在它们可用时传递它们. 我 ..
发布时间:2021-11-17 21:55:10 其他开发

SSE _mm_movemask_epi8 ARM NEON 的等效方法

我决定继续快速弯道优化并坚持_mm_movemask_epi8 SSE 指令.如何使用 uint8x16_t 输入为 ARM Neon 重写它? 解决方案 经过一些测试,下面的代码看起来是正确的: int32_t _mm_movemask_epi8_neon(uint8x16_t 输入){const int8_t __attribute__ ((aligned (16))) xr[8] ..
发布时间:2021-11-17 21:41:09 其他开发

如何确定 CPE:每个元素的周期数

如何确定程序的 CPE?例如,我有一个循环的汇编代码: #inner4: data_t = float# %rbx 中的 udata,%rax 中的 vdata,%rcx 中的限制,# i 在 %rdx 中,在 %xmm1 中求和1 .L87:#循环:2 movss (%rbx,%rdx,4), %xmm0 # 获取 udata[i]3 mulss (%rax,%rdx,4), %xmm0 # ..
发布时间:2021-11-17 02:57:42 其他开发