matlab - Using a cluster of Raspberry Pi 4 as a cluster for number crunching?
问题描述
So I am currently developing an algorithm in MATLAB that is computationally expensive but is parallel processing friendly. Given that, I have been using the parallel processing library but I am still falling short of my computation time goals.
I am currently running my algorithm on an Intel i7 8086k CPU (6 Core, 12 logical, @4.00GHz, turbo is 5GHz)
Here are my questions:
- If I was to purchase, lets say 10 raspberry pi 4 SBCs (4 cores @1.5GHz), could I use my main desktop as the host and the PIs as the clients? (Let us assume I migrate my algorithm to C++ and run it in Ubuntu for now).
1a. If I was to go through with the build in question 1, will there be a significant upgrade in computation for the ~$500 spent?
1b. If I am not able to use my desktop as host (I believe this shouldn't be an issue), how many raspberry PIs would I need to equate to my current CPU or how many would I need to make it advantageous to work on a PI cluster vs my computer?
- Is it possible to run Windows on the host computer and linux on the clients(Pis) so that I continue using MATLAB?
Thanks for your help, any other advise and recommendations are welcome
解决方案
您的算法对原始 FMA / FLOPS 吞吐量有瓶颈吗?如果是这样,那么一组弱 ARM 内核的麻烦多于其价值。如果你能以便宜的价格找到一台二手 Zen2 机器,或者 Haswell 或 Broadwell,我希望它会很好。(您必须查看核心数、时钟和 FLOPS/$。以及问题是否仍然不会是内存带宽较少的旧系统上的内存瓶颈。)
如果您因内存带宽或延迟(例如缓存不友好的数据布局)而成为缓存未命中的瓶颈,那么即使这些缓存比您的缓存小,也可能会从拥有更多较弱的 CPU 中获得一些好处,每个 CPU 都有自己的内存控制器和缓存英特尔。
Matlab 是否完全使用您的 GPU(例如通过 OpenCL)?您当前的 CPUdouble
来自 IA 内核的峰值 (FP64) 吞吐量为 96 GFLOPS,但其集成 GPU能够达到 115.2 GFLOPS。或者对于单精度 460.8 GFLOPS GPU 与来自 x86 内核的 192 GFLOPS。同样,理论上的最大吞吐量,在 CPU 上每个内核每个时钟周期运行 2 个 256 位 SIMD FMA 指令。
升级到强大的 GPU 可能比 RPi4 集群更有效。 例如https://en.wikipedia.org/wiki/FLOPS#Hardware_costs显示,2017 年每单精度 GFLOP 的成本约为 5 美分,为便宜的 CPU 添加大 GPU。或每双精度 GFLOP 79 美分。
如果您的问题是 GPU 友好的,但 Matlab 没有使用您的 GPU,请调查一下。也许 Matlab 有选项,或者您可以使用 C++ 中的 OpenCL。
花费约 500 美元的计算是否会显着升级?
RPi4 型号 B有一个 Broadcom BCM2711 SoC。CPU 是Cortex-A72。
它们的缓存层次结构 32 KB 数据 + 48 KB 指令 L1 缓存每个内核。1MB 共享二级缓存。这比具有 32k L1d + 256k L2 每核私有和共享 12MiB L3 缓存的 4GHz i7 弱。但是更快的内核在等待缓存未命中的绝对时间相同的情况下浪费了更多的周期,并且 ARM 芯片以具有竞争力的 DDR4-2400 运行其 DRAM。
RPi CPU 不是 FP 强国。 原始数据有很大的差距,但如果有足够的数据,吞吐量确实会增加。
https://en.wikipedia.org/wiki/FLOPS#FLOPs_per_cycle_for_various_processors显示 Cortex-A72 的峰值 FPU 吞吐量为double
每个内核每个周期 2 FLOPS,而英特尔自 Haswell 以来为 16,AMD 自 Zen2 以来为 16。
下降到单精度将float
x86 提高了 2 倍,但将 A72 提高了 4 倍。显然,它们的 SIMD 单元对 FP64 指令的吞吐量较低,并且每个 SIMD 向量的工作量减少了一半。(其他一些 ARM 内核对于 double 来说并不是特别慢,只是预期的 2:1,比如 Cortex-A57 和 A76。)
但所有这些都是峰值 FLOPS 吞吐量;只有通过具有良好计算强度(每次将数据加载到高速缓存和/或寄存器中的大量工作)的经过良好调整的代码才能接近实际代码中的代码。例如,密集矩阵乘法是典型的例子:O(n^3) FPU 对 O(n^2) 数据进行处理,以使缓存阻塞成为可能。或者 Prime95 是另一个例子。
尽管如此,还是粗略计算,慷慨并假设咖啡湖的持续非涡轮时钟。 (所有 6 个内核忙于每个时钟运行 2 条 256 位 FMA 指令会产生大量热量。这正是 Prime95 所做的事情,因此如果您的代码如此高效,请期待这种级别的功耗。)
- 6 * 4GHz * 4 个元素/vec * 2 vec/cycle = 48G FMAs / sec = 96 GFLOP / sec
- 每个 RPi 4 * 1.5GHz * 2 DP 触发器/时钟 = 12 GFLOP/秒。
使用 5 倍 RPi 系统,即在现有 96 GFLOP 的基础上增加了 60 GFLOPS。
以低于现有总 FP 吞吐量的价格管理 5 个 RPi 系统听起来不值得。但同样,如果您的问题具有正确的并行性,GPU 可以更有效地运行它。与高端(2017 年)显卡每 60 GFLOP 约 50 美元相比,500 美元的 60 GFLOPS 并不是什么好交易。
RPi 中的 GPU 可能具有一些计算能力,但如果您的代码对 CPU 友好,那么与将 500 美元的离散 GPU 放入现有机器相比,几乎可以肯定不值得。
或者你的问题可能不会随着理论上的最大 FLOPS 而扩展,而是可能会随着缓存带宽或其他一些因素而扩展。
是否可以在主机上运行 Windows 并在客户端(Pis)上运行 linux,以便我继续使用 MATLAB?
零线索;我只考虑在这些 CPU 上运行高效机器代码的理论最佳情况。
推荐阅读
- angular - Angular:Formbuilder中的验证器字母数字或空格
- python - 准确度指标计算是否从 TensorFlow 1.14 更改为 TensorFlow 2.3?
- javascript - 元素被状态值覆盖
- flutter - 如果包含 endDrawer,Flutter 2.0 appbar 后退按钮会消失
- laravel - Laravel:如何为自定义类函数创建 routes/console.php 条目?
- python-3.x - 有没有办法从 Dagster failure_hook 和 success_hook 获取回溯堆栈?
- python - 如何将 PEP 517 和 PEP 518 用于本地可用(不在 PYPI 上)、系统范围的 CLI Python 脚本
- c++ - 为什么我班的这个功能不起作用?
- javascript - 无法读取未定义的属性“过滤器”,React.js
- python - 多个@app.route / 函数(python / sqlite3)之间的数据传输