我有一个序列C++方案,我希望同时进行。 我知道消费物价指数的基本原理,MPI_Send
,MPI_Recv
等。 基本情况 我有一个数据生成算法,其运行速度大大快于数据处理算法。 目前,他们正在从事一系列工作,但我认为,在根本进程中管理数据生成,对奴隶进程进行数据处理,并向奴隶发出含有有待处理数据的信息。 这样,每个奴隶都处理一套数据,然后等待下一个数据集。
问题是,一旦根本进程产生数据,方案就会因奴隶们等待更多人而hang。
这是问题的一个例子:
#include "mpi.h"
#include <cassert>
#include <cstdio>
class Generator {
public:
Generator(int min, int max) : value(min - 1), max(max) {}
bool NextValue() {
++value;
return value < max;
}
int Value() { return value; }
private:
int value, max;
Generator() {}
Generator(const Generator &other) {}
Generator &operator=(const Generator &other) { return *this; }
};
long fibonnaci(int n) {
assert(n > 0);
if (n == 1 || n == 2) return 1;
return fibonnaci(n-1) + fibonnaci(n-2);
}
int main(int argc, char **argv) {
MPI_Init(&argc, &argv);
int rank, num_procs;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &num_procs);
if (rank == 0) {
Generator generator(1, 2 * num_procs);
int proc = 1;
while (generator.NextValue()) {
int value = generator.Value();
MPI_Send(&value, 1, MPI_INT, proc, 73, MPI_COMM_WORLD);
printf("** Sent %d to process %d.
", value, proc);
proc = proc % (num_procs - 1) + 1;
}
} else {
while (true) {
int value;
MPI_Status status;
MPI_Recv(&value, 1, MPI_INT, 0, 73, MPI_COMM_WORLD, &status);
printf("** Received %d from process %d.
", value, status.MPI_SOURCE);
printf("Process %d computed %d.
", rank, fibonnaci(2 * (value + 10)));
}
}
MPI_Finalize();
return 0;
}
显然,上述并非一切都是“良好做法”,但足以使这一点贯穿到底。
如果我从奴隶进程中删除<条码>,只要每个奴隶都离开,方案就退出。 我只想在根本进程完成后退出该方案,所有奴隶都处理过所寄出的一切。
如果我知道将产生多少数据集,那么我就能够看到,很多运行过程和一切都会 n然地消失,但这里的情况就是如此。
任何建议? 是否在APIC中有任何事情要做? 能否以更好的地形更好地解决这一问题? _MPI_IRecv
这更好吗? 我对我来说,我很新。
成就