我刚刚完成了基于 AMD Ryzen 2700x 和 32GB RAM(运行 Ubuntu 18.04)的台式计算机的安装。在工作中,我有一台使用了 3 年的笔记本电脑工作站,配备 Intel i7-6820HQ 和 16GB RAM(运行 Windows 10)。
我在两个平台上都安装了 Anaconda 并运行了一个自定义 Python 代码,该代码严重依赖于基本的 numpy 矩阵运算。代码不涉及任何 GPU 特定的计算(我的工作笔记本电脑没有)。Ryzen 运行在 3.7GHz,笔记本电脑 i7 运行在 3.6GHz。两个系统都已完全更新。
令我惊讶的是,代码在我的工作笔记本电脑上运行 5 分钟,而在锐龙台式机上需要 10 分钟!
最新的锐龙 2700x 应该比使用了 3 年的高端笔记本电脑英特尔处理器快得多,那为什么会慢 2 倍呢?
是因为 Ubuntu 在某些方面不是最佳的,而不是 Ryzen 的 Windows 10?
是因为英特尔比 AMD 更适合 Python 模拟吗?
还要别的吗?
感谢您帮助了解正在发生的事情。
阅读 Intel 和 AMD 之间的文档并查看代码有时会让人很难理解如何创建没有 IO 端口位图 (IOPB) 的正确任务状态段 (TSS)。使用 IOPB 创建 TSS 似乎也存在混淆,因为 IO 位图 (IOPB) 是否需要尾随字节似乎不明确0xff。
我知道 TSS 和 TSS 描述符(在 GDT 中)之间存在依赖关系。TSS 描述符控制 TSS 的基地址以及限制。描述符中的限制比结构的实际大小小一(本质上类似于 GDT 和 IDT 记录中指定的大小)。TSS 限制用于确定 IOPB 大小。
我知道:
我无法计算出现代 PC 中 cpu 和 cpu 缓存之间的总线宽度。我在互联网上没有找到任何可靠的东西。我所拥有的只是Zen (AMD) 微架构的框图,其中表示 L1 和 L2 缓存每个周期可以传输 32B(256b)。我猜测总线宽度是 256 条线(假设单数据速率)。但是,存在双倍数据速率传输,例如内存控制器和 DDR 内存之间。
总结:
我对 AMD64 (x86-64) 指令进行了大量研究,但它有点令人困惑。很多时候,官方 CPU 文档不会将指令指定为特定指令集的一部分,并且互联网有时会在特定指令所属的指令集上存在分歧。其中一个例子是SFENCE,一些消息来源声称它是 EMMX 的一部分,而另一些消息来源则声称它是 SSE 的一部分。
我试图将所有这些内容组织在一个电子表格中以帮助学习,但在一个以技术和精确着称的领域,这些不一致之处令人难以置信地令人沮丧。
我知道AMD GPU上的单块GPU内存有128MB的限制.Nvidia GPU有类似的限制吗?
在装有Windows 7 OS的计算机中,我有来自此供应商的三个版本的OpenCL SDKS:
我与他们每个人建立我的应用程序。作为输出,我有三个不同的二进制文件。例如:my_app_intel_x86,my_app_amd_x86,my_app_nvidia_x86
此二进制文件与此不同:
我可以只使用一个SDK并检查平台的运行时间吗?
我有一个应用程序用于2个数据库之间的数据传输.此应用程序的大多数操作都是独立的并且同时运行.此应用程序早先在4核心intel机器上运行,现在这个应用程序需要移植到AMD quad(4)核心机器上.我对以下几点表示怀疑.
我发现AMD不支持超线程(HTT),这显然意味着应用程序性能(吞吐量)会降低.由于Context Switching会导致性能下降,如果是,那么同时运行的线程数会减少有帮助吗?
我是否需要更改代码以提高应用程序吞吐量.
您一如既往地打开 Android Studio,但如果您想运行模拟器设备,则会出现以下错误之一:
无法安装适用于 AMD 处理器的 Android 仿真器管理程序驱动程序
或者
运行此 AVD 需要 Intel HAXM。未安装适用于 AMD 处理器的 Android 仿真器管理程序驱动程序。
或更高版本在 cmd 或 Powershell 中
[SC] 删除服务成功。[SC] StartService 失败错误 4294967201
windows processor android-emulator android-studio amd-processor
我正在学习AMD处理器L1缓存的访问过程。但我反复看了AMD的手册,还是看不懂。
我对Intel的L1数据缓存的理解是:
L1缓存是虚拟索引和物理标记的。因此,利用虚拟地址的索引位来查找对应的缓存集合,最终根据标记确定缓存集合中的哪条缓存行。
(Intel 使他们的 L1d 缓存足够关联且足够小,索引位仅来自页内偏移,与物理地址相同。因此,他们获得了 VIPT 的速度,没有任何别名问题,表现得像 PIPT .)
但AMD使用了一种新方法。在 Zen 1 中,它们有一个 32 KB、8 路组关联 L1d 缓存,该缓存(与 64KB 4 路 L1i 不同)足够小,可以在没有微标签的情况下避免别名问题。
来自AMD 2017年软件优化手册,第2.6.2.2节“AMD系列17h处理器的微架构”(Zen 1):
L1 数据缓存标签包含一个基于线性地址的微标签 (utag),它使用最初用于访问缓存行的线性地址来标记每个缓存行。负载使用此 utag 来确定使用其线性地址读取缓存的哪条路,该线性地址在通过 TLB 确定负载的物理地址之前可用。utag 是负载线性地址的哈希值。这种基于线性地址的查找使得能够在读取高速缓存数据之前非常准确地预测高速缓存行的定位方式。这允许负载仅读取单个缓存方式,而不是全部 8 个。这可以节省电量并减少存储体冲突。
utag 有可能在两个方向上都是错误的:它可以在访问将丢失时预测命中,并且在访问可能命中时预测丢失。无论哪种情况,都会发起对 L2 缓存的填充请求,并且当 L2 响应填充请求时更新 utag。
当两个不同的线性地址映射到同一物理地址时,就会发生线性别名。这可能会导致加载和存储别名缓存行的性能下降。对在 L1 DC 中有效但在不同线性别名下的地址的加载将看到 L1 DC 未命中,这需要发出 L2 缓存请求。延迟通常不会大于 L2 缓存命中的延迟。然而,如果多个别名加载或存储同时进行,则它们每个都可能会遇到 L1 DC 缺失,因为它们使用特定的线性地址更新 utag 并删除另一个能够访问高速缓存行的线性地址。
如果两个不同的线性地址没有别名到同一物理地址,那么它们也可能在 utag 中发生冲突(如果它们具有相同的线性哈希)。在给定的 L1 DC 索引 (11:6) 下,任何时候都只能访问具有给定线性哈希的一个缓存行;任何具有匹配线性散列的缓存行在 utag 中都被标记为无效并且不可访问。
第二段这句话的具体场景是什么?什么情况下命中预测为未命中,未命中预测为命中?当CPU从内存访问数据到cache时,会根据utag计算出一条cache way。然后就把它放在这里?即使其他缓存路为空?
不同的线性地址如何映射到同一个物理地址?
我读到多线程是一个单核可以管理多个线程(不是并行)的功能,好处是CPU一直在工作。对于超线程,单个核心创建 2 个虚拟核心,每个物理核心占用 2 个线程,其好处与多线程相同。
为什么很多人说超线程比多线程更好?
Ryzen CPU 使用超线程还是多线程?
cpu multithreading cpu-architecture hyperthreading amd-processor