使用MPI扩展Openmp导致大量性能损失

时间:2014-01-13 16:53:00

标签: c performance mpi openmp

首先,我是这个董事会的新手,所以如果我做错了,请纠正我。现在,我的问题:

我正在尝试编写一个混合mpi / openmp矩阵乘法程序。我的第一步是使用OPENMP在单个节点上优化矩阵乘法。这非常有效,我的表现达到了3GFLOPS左右。该程序基本上看起来像:

#include <stdlib.h>
#include <stdio.h>
#include <emmintrin.h>
#include <omp.h>
#include <time.h>
#include <math.h>
int main (int argc, char** argv){
   init_matrices(A,B,C);
   t_start=timer();
   mm(A,B,C);  // Matrix multiplication using OPENMP
   t_end = timer();
   t_delta = t_end - t_start;
   printf("time elapsed: %lf\n", t_delta*1.0e-9); 
}

OPENMP创建了4个线程,单位为mm。现在,我尝试将其扩展为n个节点的集群系统。我的第一步只是包含MPI环境并且不做任何其他更改并在一个节点上测试代码。它看起来像

#include <stdlib.h>
#include <stdio.h>
#include <emmintrin.h>
#include <omp.h>
#include <time.h>
#include <math.h>
#include "mpi.h"
int main (int argc, char** argv)
{   
    MPI_Init(&argc, &argv);
    double t_start, t_end, t_delta;
    init_matrices(A,B,C);
    t_start = timer();
    mm(A, B, C);                
    t_end = timer();
    t_delta = t_end - t_start;
    printf("time elapsed: %lf seconds\n", t_delta*1.0e-9); 
    MPI_Finalize();
    return 0;
}

我使用Gcc 4.3.2编译器和命令

编译两个代码
mpicc -o mm mm.c -O3 -fopenmp -lm

并以./mm,-prun -np 1。/ mm

运行

现在,我经历了巨大的性能损失。速度降至1.7GFLOPS(时间几乎翻倍)。这怎么可能?到目前为止我甚至都不使用通信。我预计表现会保持不变。有人有想法吗?

1 个答案:

答案 0 :(得分:-2)

我发现了错误。使用./使用当前节点上的所有CPU(在我们的双核心情况下为2)。使用prun只需要每个节点占用一个CPU,因此在这种情况下只需要一个CPU。感谢您的帮助。