我有一个线性代数代码,我试图让它运行得更快。它是一个迭代算法,在其中有一个循环和矩阵向量乘法。 到目前为止,我已经使用了MATMUL(Fortran Lib。),DGEMV,尝试在OpenMP中编写我自己的MV代码,但算法在可伸缩性方面做得并不好。无论我分配多少处理器(我已经尝试了64个处理器),速度提升仅为3.5 - 4。 分析显示在Matrix-Vector中花费了大量时间,其余的是相当标称的。 我的问题是: 我有一个共享内存系统,有大量的RAM和处理器。我曾尝试调整代码的OpenMP实现(包括Matrix Vector),但没有帮助。在MPI中编码会有帮助吗?我不是MPI的专家,但是微调消息通信的能力可能会有所帮助,但我无法确定。有什么意见吗?
更一般地说,从我读过的文献来看,MPI =分布式,OpenMP =共享,但它们能否在其他领域表现良好?像共享中的MPI一样?它会起作用吗?如果做得好,它会比OpenMP实现更好吗?
答案 0 :(得分:4)
你最好只使用已经针对多模块环境进行了优化的线性代数包,并将其用于矩阵向量乘法。 Atlas包,gotoblas(如果你有一个或更老的;可悲的是它不再被更新),或供应商BLAS实现(如英特尔CPU的MKL,ACML对于AMD来说,或者VecLib对于苹果而言,这些都需要花钱)都有良好的,经过良好调整的多线程BLAS实现。除非你有充分的理由相信你能比那些全职开发团队做得更好,否则你最好不要使用它们。
请注意,您永远不会使用DGEMM进行DGEMV的并行加速,因为向量小于另一个矩阵,因此工作量较少;但是你仍然可以做得很好,除非你已经在进行多级缓存拦截,否则你会发现使用这些库比使用手动滚动更好的性能。
答案 1 :(得分:3)
您可以在共享环境中使用MPI(尽管不是分布式环境中的OpenMP)。但是,实现良好的加速比取决于您的算法和数据依赖性要多得多。由于你有很多共享内存,我建议你坚持使用OpenMP,并仔细检查你是否在充分利用你的资源。