嗨,我正在学习 PETSc(一种用于并行数值求解 PDES 的软件),我在常问问题
需要较高的每个 CPU 内存性能。每个 CPU(多核系统中的核心)需要有自己的内存带宽,大约为 2 GB/秒或更多例如,标准的双处理器“PC”在使用第二个处理器时不会提供更好的性能,也就是说,您将不是使用第二个处理器时,可以看到速度提升。这是因为稀疏矩阵计算的速度几乎完全取决于内存的速度,而不是 CPU 的速度
我的电脑使用的是 Debian Linux 和 Ubuntu Linux 系统。如何找出我的 CPU 的内存带宽(以 Gb/s 为单位)?有没有 Linux 命令可以做到这一点?
答案1
有一个可用的内存带宽基准适用于 Linux。它是开源的,适用于 X86 和 Arm。
它将为您提供内存的原始性能以及带内存的系统性能。但它不会为您提供实时带宽。
还有一个memtop 工具。它更多地关注使用情况而不是带宽。您可以使用它在 PETSc 运行时监控系统,以查看使用了多少带宽。
还有读取 CPU 性能计数器的程序,可与页面错误结合使用。
最后,您可以随时尝试运行 PETSc。如果使用两个核心时性能翻倍,则说明您有多余的带宽。重复此操作,直到速度停止增加。这不是最优雅的方式,但很可能是最好的实用解决方案。
答案2
讨论内存带宽的常用方法是使用 Stream 基准测试,该基准测试有线程版本。给定系统的理论带宽(通道数 * 宽度 * 时钟)之间存在密切的关系 - 了解这一点很方便,因为它很容易计算。
sys memory BW* stream stream/core
R 2s x 2ch x PC3200 (numa) 12.8 6.5 3.2
S 2s 2ch x pc5400 (uma) 10.8 6.1 .76
O 2s x 4ch x pc10660 (numa) 85 51 2.1
现代机器,尤其是台式机,往往比这些老式服务器系统提供更多功能。上面的数字都是常规编译的、未调整的 Stream 运行 - 发烧友网站往往会报告基于 Windows 的调整后的伪 Stream 数字,这些数字更接近硬件的理论值。我不会使用 Memtest86 的值,因为它是一个内存模式测试器,而不是真正的基准测试。
此外,一般来说,数值代码可以有效地使用阻塞来减轻对纯内存带宽的依赖。PETSc 注释暗示它们没有阻塞,这是不幸的,因为内存没有随着片上 FLOPS 而扩展。