首先,我是这个董事会的新手,所以如果我做错了,请纠正我。现在,我的问题:
我正在尝试编写一个混合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(时间几乎翻倍)。这怎么可能?到目前为止我甚至都不使用通信。我预计表现会保持不变。有人有想法吗?
答案 0 :(得分:-2)
我发现了错误。使用./使用当前节点上的所有CPU(在我们的双核心情况下为2)。使用prun只需要每个节点占用一个CPU,因此在这种情况下只需要一个CPU。感谢您的帮助。