c++ - 输出无序,使用 MPI 进行并行编程

标签 c++ algorithm parallel-processing mpi

<分区>

我写了一些这样的代码:

void main(int argc, char **argv ) {

char message[20];
int i, rank, size, type=99;

MPI_Status status;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);

if(rank == 0) {

    strcpy_s(message, "Hello, world");

    for (i=1; i<size; i++)
        MPI_Send(message, 13, MPI_CHAR, i, type, MPI_COMM_WORLD);

} else {
    MPI_Recv(message, 20, MPI_CHAR, 0, type, MPI_COMM_WORLD, &status);
}

printf( "Message from process =%d : %.13s\n", rank, message);

MPI_Finalize();
}

我的输出是随机排序的。例如:

Message from process = 4 : Hello, world
Message from process = 2 : Hello, world
Message from process = 0 : Hello, world
Message from process = 1 : Hello, world
Message from process = 3 : Hello, world

但是我想这样做:

Message from process = 0 : Hello, world
Message from process = 1 : Hello, world
Message from process = 2 : Hello, world
Message from process = 3 : Hello, world
Message from process = 4 : Hello, world

我尝试了一些代码,但仍然处理随机顺序。

我更改我的代码。现在,每个进程都等待来自前任的消息。但仍然处理随机排序的输出。我写了 MPI_Wait,但它不起作用。

if(rank == 0) {

    strcpy_s(message, "Hello, world");
    printf( "Message from process =%d : %.13s\n", rank, message);

    MPI_Isend(message, 13, MPI_CHAR, rank + 1, type, MPI_COMM_WORLD, &request);

    MPI_Wait(&request, &status);

} else {

    MPI_Recv(message, 20, MPI_CHAR, (rank - 1) % size, type, MPI_COMM_WORLD, &status);
    printf( "Message from process =%d : %.13s\n", rank, message);

    if(rank < (size - 1)){

        MPI_Isend(message, 13, MPI_CHAR, (rank + 1) % size, type, MPI_COMM_WORLD, &request);

        MPI_Wait(&request, &status);
    }
}

我希望有人能帮助我。谢谢。

最佳答案

默认情况下,printf 语句将由碰巧首先运行的处理器计算,而不是按等级顺序计算。如果您绝对必须按排名顺序进行,那么您可以尝试类似的方法:

for(i = 0; i < size; i++) {
    if(i == rank) {
        printf("Message from process =%d : %.13s\n", rank, message);
    }

    MPI_Barrier(MPI_COMM_WORLD);
}

这会遍历每个等级,只允许打印当前等级,而其他人都会遇到 MPI_Barrier 并被迫等待。不过请记住,这不是一种可扩展的方法。

关于c++ - 输出无序,使用 MPI 进行并行编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29019744/

相关文章:

algorithm - 分而治之算法来计算 friend 点数

javascript - 无法在函数内调用非内置函数

c++ - 在定义的位置初始化 vector 的 vector - C++

c++ - QPainter怎么转? (从工厂函数中 move 一个对象)

java - 使用现有的 Fibonacci 堆 Java 实现和 Dijkstra 的最短路径 Java 实现

Java:在数组中搜索最接近的值

matlab - Matlab的parfor中的worker数量

parallel-processing - 用于混合分布式和共享内存的混合 OpenMP + OpenMPI?

c++ - g++ 使用模板时出现重复符号错误(菜鸟问题)

c++ - 使用 SSE 加速浮点 5x5 矩阵 * vector 乘法