1

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

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

4

2 回答 2

4

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

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

于 2012-01-07T16:14:25.057 回答
3

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

于 2012-01-07T14:07:53.023 回答