【发布时间】:2017-02-24 04:04:51
【问题描述】:
我是 HPC 新手,我对 MPI 在 Infiniband 上的性能感到好奇。作为参考,我在通过 IB 连接的两台不同机器上使用 OpenMPI。
我编写了一个非常简单的基准测试,以了解我可以使用 MPI 调用在 IB 上传输数据的速度。下面你可以看到代码。
问题是,当我运行它时,我的吞吐量约为 1.4 GB/秒。然而,当我使用像 ib_write_bw 这样的标准 ib 基准测试时,我得到了将近 6 GB/s。是什么导致了这种巨大的差异?我是否对 Gather 很天真,或者这只是我无法克服的 OpenMPI 开销的结果?
除了代码之外,我还提供了一个图表来显示我的简单基准测试的结果。
提前致谢!
代码:
#include<iostream>
#include<mpi.h>
#include <stdint.h>
#include <ctime>
using namespace std;
void server(unsigned int size, unsigned int n) {
uint8_t* recv = new uint8_t[size * n];
uint8_t* send = new uint8_t[size];
std::clock_t s = std::clock();
MPI_Gather(send, size, MPI_CHAR, recv, size, MPI_CHAR, 0, MPI_COMM_WORLD);
std::clock_t e = std::clock();
cout<<size<<" "<<(e - s)/double(CLOCKS_PER_SEC)<<endl;
delete [] recv;
delete [] send;
}
void client(unsigned int size, unsigned int n) {
uint8_t* send = new uint8_t[size];
MPI_Gather(send, size, MPI_CHAR, NULL, 0, MPI_CHAR, 0, MPI_COMM_WORLD);
delete [] send;
}
int main(int argc, char **argv) {
int ierr, size, rank;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
cout<<"Rank "<<rank<<" of "<<size<<endl;
unsigned int min = 1, max = (1 << 31), n = 1000;
for (unsigned int i = 1; i < n; i++) {
unsigned int s = i * ((max - min) / n);
if(rank == 0) server(s, size); else client(s, size);
}
MPI_Finalize();
}
【问题讨论】:
-
您是否尝试过使用另一个已建立的基准来验证这些性能问题与代码无关?如果您可以访问英特尔编译器和 MPI,英特尔 MPI 基准测试是验证性能问题的绝佳工具software.intel.com/en-us/articles/intel-mpi-benchmarks。您是否在基准测试中改变了负载大小或使用单一大小,热身怎么样,您运行了多少次? IMB-PingPong 将在多次迭代中运行各种负载大小,以在预热后测试带宽和吞吐量。
标签: mpi openmpi infiniband