更快的 numpy 数组复制;多线程内存?



>假设我们有两个数据类型和形状相同的大型numpy数组,大小约为GB。 将所有值从一个值复制到另一个值的最快方法是什么?

当我使用普通符号执行此操作时,例如A[:] = B,我看到计算机上只有一个内核在最大努力下进行几秒钟的复制,而其他内核则处于空闲状态。 当我使用multiprocessing启动多个工作线程并让每个工作线程将一个不同的切片复制到目标数组中时,以便复制所有数据,使用多个工作线程会更快。 无论目标阵列是共享内存阵列还是成为工作线程本地的阵列,都是如此。 在具有多个内核的计算机上的某些测试中,我可以获得 5-10 倍的加速。 随着我添加更多的工作线程,速度最终会趋于平稳甚至变慢,所以我认为这实现了内存性能的限制。

我并不是建议使用multiprocessing来解决这个问题;它只是为了证明更好的硬件利用率的可能性。

是否存在一些多线程C/C++memcpy工具的python接口?

更新(03 五月 2017)

在可能的情况下,使用多个python进程来移动数据可以大大加快速度。 我有一个场景,其中我已经有几个小的共享内存缓冲区被工作进程写入。 每当一个填满时,主进程都会收集此数据并将其复制到主缓冲区中。 但是,让主节点仅选择主缓冲区中的位置,并分配记录工作线程来实际执行复制(从备用的大量记录进程中)要快得多。 在我的特定计算机上,并发工作线程可以在几分之一秒内移动几 GB,而不是单个进程可以在几秒钟内移动。

尽管如此,这种设置并不总是(甚至通常?)可能的,所以让一个 python 进程能够放入多线程 memcpy 例程中会很棒......

如果您确定两个数组的类型/内存布局相同,这可能会给您一个加速:memoryview(A)[:] = memoryview(B)这应该直接使用 memcpy 并跳过对 numpy 广播或类型转换规则的任何检查。

最新更新