【问题标题】:MPI and OpenMP. Do I even have a choice?MPI 和 OpenMP。我还有选择吗?
【发布时间】:2012-02-04 20:50:59
【问题描述】:

我有一个线性代数代码,我试图让它运行得更快。它是一种迭代算法,其中包含循环和矩阵向量乘法。 到目前为止,我已经使用了 MATMUL(Fortran Lib.)、DGEMV,尝试在 OpenMP 中编写我自己的 MV 代码,但该算法在可扩展性方面并没有做得更好。无论我分配多少个处理器(我已经尝试了 64 个处理器),加速都几乎没有 3.5 - 4。 分析显示在 Matrix-Vector 中花费了大量时间,其余时间相当名义上。 我的问题是: 我有一个拥有大量 RAM 和处理器的共享内存系统。我曾尝试调整代码的 OpenMP 实现(包括矩阵向量),但没有帮助。在 MPI 中编码会有所帮助吗?我不是 MPI 的专业人士,但微调消息通信的能力可能会有所帮助,但我不能确定。有cmets吗?

更一般地说,从我读过的文献来看,MPI = 分布式,OpenMP = 共享,但它们能在其他领域表现良好吗?像共享中的 MPI?它会起作用吗?如果做得好,会比 OpenMP 实现更好吗?

【问题讨论】:

    标签: mpi openmp linear-algebra lapack intel-fortran


    【解决方案1】:

    您最好只使用已经针对多核环境进行了优化的线性代数包,并将其用于矩阵向量乘法。 Atlas 包、gotoblas(如果您有 nehalem 或更旧版本;遗憾的是它不再更新)或供应商 BLAS 实现(例如用于英特尔 CPU 的 MKL,用于 AMD 的ACML,或用于VecLib苹果,都需要花钱)都具有良好的、经过良好调整的多线程 BLAS 实现。除非您有充分的理由相信自己可以比那些全职开发团队做得更好,否则最好使用它们。

    请注意,使用 DGEMV 永远不会像使用 DGEMM 那样获得并行加速,只是因为向量小于另一个矩阵,因此工作量更少;但是您仍然可以做得很好,并且您会发现使用这些库比使用任何手动操作获得的性能要好得多,除非您已经在进行多级缓存阻塞。

    【讨论】:

    • 您是否在使用多线程 MKL(使用 Composer XE,添加 -mkl=parallel ?)多线程与单线程相比,您的加速是多少,为什么您担心它还不够?您不必重写任何您的代码来使用多线程库。
    • 我的编译标志是: export MKL_NUM_THREADS=4 ifort -fp-model source Code.f90 -L$MKLROOT/lib/ia32 -lmkl_blas95 -lmkl_intel -lmkl_intel_thread -lmkl_core -openmp -lpthread && time ./ a.out 我使用 VTune 进行分析
    【解决方案2】:

    您可以在共享环境中使用 MPI(但在分布式环境中不能使用 OpenMP)。但是,实现良好的加速比更多地取决于您的算法和数据依赖性,而不是使用的技术。由于您拥有大量共享内存,我建议您坚持使用 OpenMP,并仔细检查您是否充分利用了资源。

    【讨论】:

      猜你喜欢
      • 2018-09-29
      • 2023-03-28
      • 2012-10-20
      • 2011-01-10
      • 2015-03-26
      • 1970-01-01
      • 2012-11-12
      • 2013-10-29
      • 1970-01-01
      相关资源
      最近更新 更多