我有一个线性代数代码,我正在努力让它运行得更快。它是一种迭代算法,在中包含循环和矩阵向量乘法。到目前为止,我已经使用了MATMUL(Fortran库)、DGEMV,并尝试在OpenMP中编写我自己的MV代码,但该算法在可扩展性方面并没有做得更好。无论我分配了多少处理器,速度都只有3.5-4(我已经尝试了64个处理器)。分析显示,在矩阵向量中花费了大量时间,其余时间相当正常。我的问题是:我有一个共享内存系统,里面有大量的RAM和处理器。我试过调整OpenMP的代码实现(包括矩阵向量),但没有帮助。用MPI进行编码会有帮助吗?我不是MPI的专业人员,但微调消息通信的能力可能会有所帮助,但我不能确定。有什么意见吗?
更普遍地说,从我读到的文献来看,MPI=分布式,OpenMP=共享,但它们在其他领域能表现得很好吗?像Shared中的MPI?它行得通吗?如果做得好,它会比OpenMP实现更好吗?
您最好只使用一个已经针对多核环境进行了良好优化的线性代数包,并将其用于矩阵向量乘法。Atlas软件包、gotoblas(如果你有nehalem或更旧版本;遗憾的是,它不再更新)或供应商的BLAS实现(如英特尔CPU的MKL、AMD的ACML或苹果的VecLib,这些都需要花钱)都有很好的、调整良好的多线程BLAS实现。除非你有充分的理由相信你可以比那些全职开发团队做得更好,否则你最好使用他们。
请注意,使用DGEMV永远不会像使用DGEMM那样获得并行加速,因为向量比另一个矩阵小,因此工作量较小;但是您仍然可以做得很好,并且您会发现使用这些库的性能比使用任何手动操作的库都要好得多,除非您已经在进行多级缓存阻塞。
您可以在共享环境中使用MPI(尽管在分布式环境中不能使用OpenMP)。然而,实现良好的加速在很大程度上取决于您的算法和数据依赖性,而不是所使用的技术。既然你有很多共享内存,我建议你坚持使用OpenMP,并仔细检查你是否充分利用了你的资源。