【问题标题】:How to store data in seperate memory mdoules如何将数据存储在单独的内存模块中
【发布时间】: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

5950x 基准测试是:

所有这些基准测试都是在没有任何手动内存管理的情况下执行的,并且由于数据的总体大小相对较小(120MB),我假设 python 将它们放在一个记忆棒上(所有系统都有双通道内存)。我不确定是否有可能以某种方式告诉 python 拆分数据并将其存储在不同的物理内存模块上,以便算法可以利用双通道内存。我尝试使用谷歌搜索在 C++ 中执行此操作,但也没有成功。内存是由操作系统自动管理的还是可以这样做?

P.S.:在您发表评论之前,我已确保尽可能均匀地分配输入。此外,采样算法非常简单(乘法和累加),因此存在内存瓶颈并不是一个荒谬的概念(这在图像处理算法中实际上很常见)。

【问题讨论】:

    标签: python multithreading memory memory-management


    【解决方案1】:

    操作系统管理将程序虚拟地址空间拆分为不同的物理地址(内存条、页面文件等),这对 python 或任何编程语言都是透明的,所有系统都已经使用内存条进行读写。

    float64 和 float32 具有相同性能的事实意味着每个核心缓存几乎从不使用,因此请考虑在您的算法中更好地利用它,使您的代码对缓存更友好。

    虽然这对于只计算乘法的循环来说似乎很难,但您可以对计算进行分组以减少访问内存的次数。

    【讨论】:

    • 这就是我的假设,但是内存基准测试工具如何获得正确的结果呢?如果他们无法在所有内存通道上执行事务,则总带宽可能会出现 2 或 4 倍的错误。另外,我知道这里基本上不使用缓存(因此存在内存带宽问题) ,但执行稀疏卷积不是缓存友好操作(每个系数在每个采样步骤中仅使用一次),这意味着这是可行的最佳结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 2016-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-27
    相关资源
    最近更新 更多