- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
想象一个如下所示的加载-存储循环,它从非连续位置加载 DWORD
并将它们连续存储:
top:
mov eax, DWORD [rsi]
mov DWORD [rdi], eax
mov eax, DWORD [rdx]
mov DWORD [rdi + 4], eax
; unroll the above a few times
; increment rdi and rsi somehow
cmp ...
jne top
在现代 Intel 和 AMD 硬件上,当在缓存中运行时,这样的循环通常会在每个周期将 ones 存储在一个存储中。这有点浪费,因为那只是一个 2 的 IPC(一个商店,一个负载)。
自然而然出现的一个想法是将两个 DWORD
加载组合到一个 QWORD
存储中,这是可能的,因为这些存储是连续的。像这样的东西可以工作:
top:
mov eax, DWORD [rsi]
mov ebx, DWORD [rdx]
shl rbx, 32
or rax, rbx
mov QWORD [rdi]
基本上执行两个加载并使用两个 ALU 操作将它们组合成单个 QWORD
,我们可以将其存储在一个存储中。现在我们在微指令上遇到了瓶颈:每 2 个 DWORD
5 微指令 - 所以每个 QWORD
1.25 个周期或每个 DWORD
0.625 个周期。
已经比第一个选项好得多,但我忍不住认为有一个更好的选择来进行这种改组 - 例如,我们通过使用普通加载来浪费 uop 吞吐量 - 它感觉就像我们应该能够将至少一些 ALU 操作与带有内存源操作数的负载结合起来,但我在 Intel 上大多受阻:内存上的 shl
只有 RMW 形式,而 shlx
和 rolx
没有微熔丝。
似乎我们可以通过将第二个负载设为 QWORD
负载偏移量 -4
来免费获得转换,但随后我们将清除垃圾在负载 DWORD
中。
我感兴趣的是标量代码,以及基本 x86-64 指令集和更好版本的代码(如果可能的话)以及有用的扩展,例如 BMI
。
最佳答案
It also seems like we could maybe get the shift for free by making the second load a QWORD load offset by -4, but then we are left clearing out garbage in the load DWORD.
如果更宽的负载对于正确性和性能来说是可以的(缓存行拆分...),我们可以使用 shld
top:
mov eax, DWORD [rsi]
mov rbx, QWORD [rdx-4] ; unaligned(?) 64-bit load
shld rax, rbx, 32 ; 1 uop on Intel SnB-family, 0.5c recip throughput
mov QWORD [rdi], rax
MMX punpckldq mm0, [mem]
SnB 系列(包括 Skylake)上的微型 fuse 。
top:
movd mm0, DWORD [rsi]
punpckldq mm0, QWORD [rdx] ; 1 micro-fused uop on Intel SnB-family
movq QWORD [rdi], mm0
; required after the loop, making it only worth-while for long-running loops
emms
不幸的是,punpckl 指令有一个向量宽度内存操作数,而不是半宽度。这通常会破坏它们在其他情况下完美的用途(尤其是 16B 内存操作数必须对齐的 SSE2 版本)。但请注意,MMX 版本(只有一个 qword 内存操作数)没有对齐要求。
您也可以使用 128 位 AVX 版本,但这更有可能跨越缓存行边界并且速度很慢。 (Skylake 不会通过仅加载所需的 8 个字节来进行优化;具有对齐的 mov
+ vpunckldq xmm1, xmm0, [cache_line-8]
的循环以每 2 次 1 次迭代运行时钟 vs. 每个时钟 1 个迭代。)如果 16 字节负载跨入未映射的页面,则 AVX 版本需要出错,因此如果没有负载端口的额外支持,它不能只使用较窄的负载。 :/
这样一个令人沮丧和无用的设计决定(大概是在加载端口可以免费零扩展之前做出的,并且没有用 AVX 修复)。至少我们有 movhps
作为内存源 punpcklqdq
的替代品,但实际随机播放的较窄宽度无法替代。
为避免 CL split ,您还可以使用单独的 movd
加载和 punpckldq
,或 SSE4.1 pinsrd
。有了这个,就没有理由使用 MMX。
top:
movd xmm0, DWORD [rsi]
movd xmm1, DWORD [rdx] ; SSE2
punpckldq xmm0, xmm1
; or pinsrd xmm0, DWORD [rdx], 1 ; 2 uops not micro-fused
movq QWORD [rdi], xmm0
显然 AVX2 vpgatherdd
是一种可能性,并且可能在 Skylake 上表现良好。
关于performance - 将两个 DWORD 打包成一个 QWORD 以节省存储带宽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47242353/
USRP2 可以处理的最大带宽是多少? 最佳答案 100MS/s I & Q 下的 USRP2 A/D 样本被缩减为 25MS/s 复杂。我们使用 16 位 I & Q。 这在 USRP2 的千兆以太
使用下面的脚本来检测连接到网络的系统的互联网速度。引用javascript to detect internet speed 但是,https://fast.com/ 的速度结果和 http://ww
我需要能够使用java监视内部网络的速度。我当时想我可以使用一个包含服务器和客户端的两部分系统。我不需要响应时间(例如使用ping生成的响应时间),但不需要上载和下载时的mbps实际速度。 我的想法是
我正在使用 HttpWebRequest 调用页面并使用 HttpWebResponse 获取结果, 我的问题是如何获取或计算返回页面的总大小(以字节为单位)。此外,我还想知道我用来调用该页面的流量/
使用 Firebase,我为字段指定易于理解的名称,例如“timestamp”、“last_changed”、“message_direction”等。 字段名称是每个“行”数据交换的一部分吗? 意思
使用 Firebase,我为字段指定易于理解的名称,例如“timestamp”、“last_changed”、“message_direction”等。 字段名称是每个“行”数据交换的一部分吗? 意思
最近我接到了一项任务,要在 Nexus 7 平板电脑上开发 Android 应用程序,该应用程序将使用 wifi 通过 tcp 套接字与电脑连接。 特别是我必须将图像流(例如未压缩的 BMP)传递给平
我正在编写一个在服务器上运行的应用程序,我需要能够为每个以太网端口设置最大带宽(最多有 6 个端口)。 显然我可以限制我的应用程序使用的带宽,但我还没有找到任何关于限制计算机上实际以太网端口带宽的信息
我有一个 gRPC用 Go 编写的服务,它有很长的运行流。我想要一种方法来测量每个流的网络/带宽使用情况,并将该信息提供给 prometheus . 我找到了 grpc.StreamServerInt
我制作了一个 OpenCL 程序并使用固定内存 (CL_MEM_ALLOC_HOST_PTR) 来获得从设备到主机的更高传输速率。 传输速率按我的预期增加(使用 AMD APP Profiler 2.
有什么方法可以在 Xcode 中以编程方式检查互联网连接速度或带宽。我正在尝试这样做,因为慢速连接给某些图像上传带来了问题。 最佳答案 如果你真的需要知道,你将不得不测试它。 设置与具有低延迟的已知服
我已将大小为 876MB 的文件推送到 git lfs,这分别显示了我总共 0.9 的可用存储空间和带宽,但是,然后我做了一些更改,例如删除了旧存储库并卸载了 git lfs,因为我将图像大小从 90
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 8 个月前关闭。 Improve this ques
这个问题在这里已经有了答案: How to programmatically check Internet bandwidth in VC++? (3 个答案) 关闭 8 年前。 我想在 vc++
这让我发疯,所以我想看看是否有人能给我一个线索。我有一个小型 VPS,运行 Centos 5、最新的 Apache、MySQL 和 PHP。 大约 1% 的用户报告页面加载速度非常慢,即使对于静态 H
在 Win32 中有没有什么方法可以在不实际传输任何数据的情况下以编程方式确定给定网络接口(interface)的带宽?我只想区分不同类型的接口(interface)(例如拨号 vs DSL vs L
我了解延迟 - 消息从发件人到收件人所需的时间 - 和带宽 - 在给定时间内可以传输的最大数据量 - 但我正在努力寻找合适的术语来描述相关事物: 如果协议(protocol)是基于对话的——负载在端点
我试图找到内存泄漏,我已将其归零到这部分代码,但我找不到内存泄漏的位置或如何修复它,当我让一些人调查时他们建议它与此处提到的“代码”有关: https://golang.org/src/time/ti
我正在使用 WCF 编写客户端和服务器代码,我需要知道客户端和服务器之间的“感知”流量带宽。我可以使用 ping 统计信息单独收集此信息,但我想知道是否有一种方法可以在 WCF 中配置 channel
我知道可以在对等连接上使用“setParameter”来限制上传(发送)带宽。我正在寻找一种方法来限制下载(已接收)但找不到。(我没有控制权 我错过了这个概念吗?或者有办法做到这一点? 谢谢 最佳答案
我是一名优秀的程序员,十分优秀!