我是一个包装工MPI用户,我可能会因为我的并行代码而犯了一些错误。
我需要计算一个大型数据集的迭代估计,我想用C中的MPI并行计算它。
我制作了一个标准(ANSI)C函数('myFunc')来根据输入参数('param_1',param_3,'table_1','table_2',估计输出数据集中的元素('param_2'), 'table_3')和前一次迭代的估计('param_2')。如果我们将新估计('param_2')划分为块,则可以并行完成计算。
当我对代码进行一些分析时,我意识到计算几乎同时在每个节点(线程)上开始,但是它以一个接一个的顺序完成(它们之间有一个固定的时间间隔) )。 看起来他们正在使用一些共享资源或类似的东西...我试图消除线程之间的所有并发,但我很害怕我没有足够的MPI经验来解决问题。
我认为所有MPI线程都有自己的声明变量的“副本”,并且彼此独立地使用它们,所以我不明白为什么线程在拥有自己的副本时等待彼此完成计算参数...
以下是代码的简单版本:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <mpi.h>
#define X 131
#define Y 131
#define Z 150
#define MASTER 0
float table_1[31][8];
float table_2[31][4];
float table_3[31][2];
int main(int argc, char* argv[]) {
float *param_1;
float *param_2;
float param_3;
float *chunk;
int file_length = X*Y*Z;
float myFunc(int i, float *param_1, float *param_2, float param_3);
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &taskid);
MPI_Comm_size(MPI_COMM_WORLD, &numtasks);
chunk_size = ceil(file_length / numtasks);
/* Allocate memory for the input parameters */
param_1 = malloc(file_length*sizeof(float));
param_2 = malloc(file_length*sizeof(float));
if( taskid == MASTER) {
/* Read parameters from file (table_1, table_2, table_3, param_1) */
}
MPI_Bcast(table_1,31*8,MPI_FLOAT,MASTER,MPI_COMM_WORLD);
MPI_Bcast(table_2,31*4,MPI_FLOAT,MASTER,MPI_COMM_WORLD);
MPI_Bcast(table_3,31*2,MPI_FLOAT,MASTER,MPI_COMM_WORLD);
MPI_Bcast(param_1,file_length,MPI_FLOAT,MASTER,MPI_COMM_WORLD);
for(it = 0; it < 10; it++) {
for(i = 0; i < chunk_size; i++) {
chunk[i] = myFunc((taskid*chunk_size)+i, param_1, param_2, param_3);
}
MPI_Gather(chunk, chunk_size, MPI_FLOAT, param_2, chunk_size, MPI_FLOAT, MASTER, MPI_COMM_WORLD);
MPI_Bcast(param_2, file_length, MPI_FLOAT, MASTER, MPI_COMM_WORLD);
}
MPI_Finalize();
free(...);
return 0;
}
float myFunc(int i, float *param_1, float *param_2, float param_3) {
/* Using the global tables (table_1,table_2,table_3) and some localy declared variable */
/* No MPI function here, only Math functions */
}
如果您有解决方案,建议或评论请善意并与我分享,我将不胜感激,谢谢!