MPI 使用消息标签将值按正确顺序排列
MPI using message tag to put the values in right order
我写了一个小程序,我将一些放在数组中的随机值从我的主进程发送到从属进程。奴隶正在计算小方程,他们应该把结果发回给主人。现在主人应该将结果以正确的顺序放置到新的结果数组中。我正在使用消息标签。
以下是方法:
将我的任务列表中的一个元素发送给奴隶
void Ccalculation::masterSend(int * tasklist)
{
for (int i = 1; i < this->world_size; i++) {
MPI_Send(&tasklist[current], 1, MPI_INT, i, current, MPI_COMM_WORLD);
current++;
}
}
slave从master接收任务
void Ccalculation::slaceRecv()
{
MPI_Status status;
MPI_Recv(&slaveTask, 1, MPI_INT, 0, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
//here I am creating variable whith tag which I ll be returning
msgTag = status.MPI_TAG;
cout << "msg tag: " << status.MPI_TAG << " number " << slaveTask << endl;
}
问题从这里开始
正在将解决方案发送给带有特定标签的大师
void Ccalculation::slaveSend(double solution)
{
MPI_Send(&solution, 1, MPI_DOUBLE, 0, msgTag, MPI_COMM_WORLD);
}
master接收解并放入solutionArray
void Ccalculation::masterRecv(double *solutionTab)
{
double buffer = 0;
MPI_Status status;
for (size_t i = 0; i < this->world_size; i++)
{
MPI_Recv(&buffer, 1, MPI_DOUBLE, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
solutionTab[status.MPI_TAG] = buffer;
}
}
MPI 是解决此类问题的内置函数。它们被称为集体行动。特别是,要将任务列表中的元素(如您所称)分发到不同的进程,您可以使用 MPI_Scatter. The reverse operation of collecting one element from each process is realized by MPI_gather.
您只需一行代码即可替换 masterSend
和 slaceRecv
函数:
MPI_Scatter(tasklist, this->world_size, MPI_INT, ¤t, 1, MPI_INT, 0, MPI_COMM_WORLD);
类似地,您可以使用 MPI_Gather
.
仅用一行代码替换函数 slaveSend
和 masterRecv
我写了一个小程序,我将一些放在数组中的随机值从我的主进程发送到从属进程。奴隶正在计算小方程,他们应该把结果发回给主人。现在主人应该将结果以正确的顺序放置到新的结果数组中。我正在使用消息标签。 以下是方法:
将我的任务列表中的一个元素发送给奴隶
void Ccalculation::masterSend(int * tasklist)
{
for (int i = 1; i < this->world_size; i++) {
MPI_Send(&tasklist[current], 1, MPI_INT, i, current, MPI_COMM_WORLD);
current++;
}
}
slave从master接收任务
void Ccalculation::slaceRecv()
{
MPI_Status status;
MPI_Recv(&slaveTask, 1, MPI_INT, 0, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
//here I am creating variable whith tag which I ll be returning
msgTag = status.MPI_TAG;
cout << "msg tag: " << status.MPI_TAG << " number " << slaveTask << endl;
}
问题从这里开始
正在将解决方案发送给带有特定标签的大师
void Ccalculation::slaveSend(double solution)
{
MPI_Send(&solution, 1, MPI_DOUBLE, 0, msgTag, MPI_COMM_WORLD);
}
master接收解并放入solutionArray
void Ccalculation::masterRecv(double *solutionTab)
{
double buffer = 0;
MPI_Status status;
for (size_t i = 0; i < this->world_size; i++)
{
MPI_Recv(&buffer, 1, MPI_DOUBLE, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
solutionTab[status.MPI_TAG] = buffer;
}
}
MPI 是解决此类问题的内置函数。它们被称为集体行动。特别是,要将任务列表中的元素(如您所称)分发到不同的进程,您可以使用 MPI_Scatter. The reverse operation of collecting one element from each process is realized by MPI_gather.
您只需一行代码即可替换 masterSend
和 slaceRecv
函数:
MPI_Scatter(tasklist, this->world_size, MPI_INT, ¤t, 1, MPI_INT, 0, MPI_COMM_WORLD);
类似地,您可以使用 MPI_Gather
.
slaveSend
和 masterRecv