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

3
假设我们有两个相同数据类型和形状的大型numpy数组,大小约为GB级别。将所有值从一个复制到另一个的最快方法是什么?
当我使用正常符号进行此操作时,例如A[:] = B,我会看到计算机上的一个核心在几秒钟内以最大的努力进行复制,而其他核心则处于空闲状态。 当我使用multiprocessing启动多个工作进程,并让它们每个人将不同的切片复制到目标数组中,以便复制所有数据时,使用多个工作进程会更快。无论目标数组是共享内存数组还是成为工作进程的本地数组,这都是正确的。在具有多个核心的机器上,在一些测试中,我可以获得5-10倍的加速。随着我添加更多的工作进程,速度最终会平稳下来,甚至会变慢,因此我认为这达到了内存性能限制。
我并不建议在这个问题上使用multiprocessing;它只是为了证明更好的硬件利用可能性。
是否存在一种python接口,可以使用一些多线程C / C ++ memcpy工具?
更新(2017年5月3日)
如果可能,使用多个python进程移动数据可以大大提高速度。我有一个场景,其中我已经有几个小的共享内存缓冲区被工作进程写入。每当一个填满时,主进程会收集这些数据并将其复制到主缓冲区中。但是,只有选择主缓冲区中的位置,并分配一个记录工作进程来实际执行复制(从大量待命的记录进程中),才能更快地完成。在我的特定计算机上,可以通过并发工作进程在很短的时间内移动几GB,而单个进程需要几秒钟。
尽管如此,这种设置并不总是(甚至通常不是)可能的,因此最好有一个单个python进程能够进入多线程memcpy例程...

这很奇怪,考虑到CPU和内存的相对速度,我认为单个核心足以饱和内存带宽,忽略NUMA是不合理的... - Matteo Italia
然而,编写一个执行memcpy的C库,如果请求的大小足够大,则可能是并发的,这是非常简单的,然后您可以通过ctypes简单地调用它。但是再次强调,一个良好编写的memcpy甚至在不涉及多线程的情况下也可以饱和内存。 - Matteo Italia
1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接