高效的平行3D旋转

时间:2015-07-14 12:15:56

标签: python 3d parallel-processing rotation

我有一个大的(1000x1000x5000)3D numpy阵列,我需要在其上执行许多3D旋转,然后计算非对称距离变换。距离变换可以简单地并行化,但是我需要一种方法来使用计算集群(它没有那么多[例如2GB]内存/核心)来执行旋转。什么是有效利用计算集群的好策略? (它没有任何GPU或其他专用硬件)。 是的,我需要旋转的音量 - 这意味着我不能简单地重新标记坐标,因为非对称距离变换会多次覆盖数据集。 我在集群上使用的软件:python3.4.2,scipy,numpy和mpi4py。

谢谢!

1 个答案:

答案 0 :(得分:1)

如果你想在集群上并行执行矩阵运算(例如,你可以表示为矩阵乘法的旋转),我会做的是。

  1. 使用多线程BLAS(例如OpenBLAS)编译numpy,因此矩阵乘法在节点上是多线程的。优点是您知道这已经过广泛测试和优化,您无需担心并行扩展。
  2. 假设机器每个节点有32个核心(即2 * 32 =总共64 GB的RAM)。我将为每个节点运行~4个MPI任务,具有8个线程/ MPI任务(因此可用的RAM /任务为16 GB,从而消除了低RAM限制)。
  3. 在MPI任务中对数组进行域分解。例如,this code (see _mprotate function)使用scipy.ndimage使用multiprocessing计算轮换,您可以使用mpi4py执行类似的操作。
  4. 虽然问题在于,除非我弄错了,scipy.ndimage.interpolation.rotate不使用BLAS的矩阵运算,并且是纯C实现,最终调用NI_GeometricTransform函数。因此,除非您使用不同的算法,否则上述方法将无效。然后,您必须运行与核心一样多的MPI任务,并在它们之间进行域分解(请参阅mpi4py教程)。

    这并不能完全回答你的问题,但希望有所帮助。