【发布时间】:2022-12-05 00:38:50
【问题描述】:
我正在使用 Python 开发图像处理管道,我使用 Cython 进行主要计算,以便它可以运行得非常快。从早期的基准测试中,我发现了一个内存瓶颈,即代码根本无法使用多线程进行扩展。
我稍微修改了算法以减少所需的带宽,现在它扩展到 2 个内核(4 个超线程线程),但它仍然成为内存带宽的瓶颈。如果你好奇,你可以在这里找到不同版本的算法:https://github.com/2332575Y/
我已经通过在 i7-6700HQ(扩展到 4 个线程)、i5-7600K(扩展到 2 个线程(核心),因为 i5 没有超线程)和 R9-5950X(扩展到 4 个线程)上运行基准测试来确认这一点线程)。此外,尽管这些 CPU 之间存在巨大的性能差异,但它们之间的相对性能与内存速度之间的差异完全相同。您可以在此处找到 6700HQ 执行的基准测试: https://github.com/2332575Y/Retina-V3/blob/main/Untitled.ipynb
所有这些基准测试都是在没有任何手动内存管理的情况下执行的,并且由于数据的总体大小相对较小(120MB),我假设 python 将它们放在一个记忆棒上(所有系统都有双通道内存)。我不确定是否有可能以某种方式告诉 python 拆分数据并将其存储在不同的物理内存模块上,以便算法可以利用双通道内存。我尝试使用谷歌搜索在 C++ 中执行此操作,但也没有成功。内存是由操作系统自动管理的还是可以这样做?
P.S.:在您发表评论之前,我已确保尽可能均匀地分配输入。此外,采样算法非常简单(乘法和累加),因此存在内存瓶颈并不是一个荒谬的概念(这在图像处理算法中实际上很常见)。
【问题讨论】:
标签: python multithreading memory memory-management