Python 高效的平行三维旋转

Python 高效的平行三维旋转,python,3d,parallel-processing,rotation,Python,3d,Parallel Processing,Rotation,我有一个大的(1000x1000x5000)3D numpy阵列,我需要在其上执行许多3D旋转,然后计算不对称距离变换。距离变换可以简单地并行化,但我需要一种方法来使用计算集群(它没有太多(例如2GB)内存/核心)执行旋转本身。高效利用计算集群的好策略是什么?(它没有任何GPU或其他专用硬件)。 是的,我需要旋转的体积-这意味着我不能简单地重新标记坐标,因为非对称距离变换将多次覆盖数据集。 我在集群上使用的软件:python3.4.2和scipy、numpy和mpi4py 谢谢 如果您想在集群上

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


谢谢

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

  • 使用多线程BLAS(例如OpenBLAS)编译numpy,以便矩阵乘法在节点上是多线程的。优点是您知道这已经过广泛的测试和优化,您不需要担心并行扩展
  • 假设机器每个节点有32个内核(即2*32=64 GB的RAM)。我将使用8个线程/MPI任务在每个节点上运行~4个MPI任务(因此可用RAM/task为16 GB,从而消除了低RAM限制)
  • 在MPI任务中对阵列进行域分解。例如,使用
    scipy.ndimage
    进行旋转计算使用
    多处理
    ,您可以执行类似的操作,但使用
    mpi4py
    尽管问题是,除非我弄错了,
    scipy.ndimage.interpolation.rotate
    不使用BLAS的矩阵运算,它是一个纯C实现,最终调用该函数。因此,除非使用不同的算法,否则上述方法将不起作用。然后,您必须运行与内核数量相同的MPI任务,并在它们之间进行域分解(请参阅
    mpi4py
    tutorials)


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

    您所说的三维旋转是什么意思?因为数据集没有正确的形状来表示三维空间中的点。另外,
    np.zero((100010005000),dtype='float64')
    是38GB,因此如果每个核有2GB,那么只需要约40个核来容纳输入和输出阵列,更不用说执行操作了。实际上,考虑到临时阵列,此任务可能至少需要128个内核。每个节点有多少个内核?在scipy中有scipy.ndimage.interpolation.rotate,我希望在集群上并行执行。因为我有一台超级计算机,128核是可以处理的。我在如何有效地设置任务方面没有太多经验,我想知道是否有一些并行矩阵操作的“食谱”。