【发布时间】:2023-02-22 22:27:12
【问题描述】:
我在 Raspberry Pi 4B(四核 ARM)上使用 numpy.sum() 进行实时图像处理。数据是 8 位无符号整数(uint8 类型)的二维数组,典型大小为 2048 x 2048。重要的操作之一是对行和列求和:
vertical = np.sum(data, axis=0)
horizontal = np.sum(data, axis=1)
我注意到这些操作只会使一个 CPU 核心饱和,而其他三个核心则处于空闲状态。这与多线程 numpy 操作形成对比,例如 a = np.dot(data,data),它会使所有四个 CPU 内核饱和。
我通过启动四个单独的执行线程来加速我的代码。四个线程做如下操作:
thread 1: vertical1 = np.sum(data[ 0:1024, : ], axis=0)
thread 2: vertical2 = np.sum(data[1024:2048, : ], axis=0)
thread 3: horizontal1 = np.sum(data[ : , 0:1024], axis=1)
thread 4: horizontal2 = np.sum(data[ : ,1024:2048], axis=1)
线程完成后,我将两个垂直数组和两个水平数组相加,以获得我想要的结果。
有没有办法配置或构建 numpy,以便我描述的多核并行化类型可以由 np.sum() 自动完成?这显然发生在一些线性代数例程中,事实上,我可以通过使用 np.dot() 将包含所有 1 的向量点到我的帧矩阵中来获得小的加速。然而,虽然这确实使用了多核,但它比我上面描述的简单的“四线程”方法要慢得多。
【问题讨论】:
-
是什么让你认为
np.dot运行于“所有四个 CPU 内核”?