MPI 导致断点

MPI causes breakpoint

我制作了一个使用 MS MPI 计算字符数的应用程序,但它在以下位置导致了 4 个断点: MPI_File_get_sizeMPI_File_set_viewMPI_File_read 并再次出现在 MPI_File_get_size(fh, &size)。 你知道是什么原因造成的吗?完整代码如下:

#include "stdafx.h"
#include "mpi.h"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stack>

using namespace std;


int main(int argc, char *argv[])
{

    int   numprocs, rank, buffer[100];

    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &numprocs);

    MPI_Status status;
    MPI_File fh;
    MPI_Offset size;
    int char_number;
    const char plik[10] = "file.txt";

    MPI_File_open(MPI_COMM_WORLD, plik, MPI_MODE_RDONLY, MPI_INFO_NULL, &fh);
    MPI_File_get_size(fh, &size);

    MPI_File_set_view(fh, rank*(size / numprocs), MPI_CHAR, MPI_CHAR, "native", MPI_INFO_NULL);


    MPI_File_read(fh, &buffer[100], 1, MPI_CHAR, &status);

    char_number = MPI_File_get_size(fh, &size);
    MPI_File_close(&fh);


    if (rank == 0) {

        for (int i = 0; i < numprocs; i++) {

            MPI_Recv(&char_number, i, MPI_INT, 0, 1, MPI_COMM_WORLD, &status);

        }
    }

    else {

        MPI_Send(&char_number, 0, MPI_INT, 0, 3, MPI_COMM_WORLD);

    }


    MPI_Finalize();

    return 0;
}

编辑:摆脱了断点,但现在没有收到任何输出:

#include "stdafx.h"
#include "mpi.h"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stack>

using namespace std;


int main(int argc, char *argv[])
{

    int   numprocs, rank;
    char buffer[100] = { 0 };

    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &numprocs);

    MPI_Status status;
    MPI_File fh;
    MPI_Offset size;
    int char_number;
    const char plik[10] = "file.txt";

    MPI_File_open(MPI_COMM_WORLD, plik, MPI_MODE_RDONLY, MPI_INFO_NULL, &fh);
    MPI_File_get_size(fh, &size);

    MPI_File_set_view(fh, rank*(size / numprocs), MPI_CHAR, MPI_CHAR, "native", MPI_INFO_NULL);


    MPI_File_read(fh, buffer, (size/numprocs), MPI_CHAR, &status);

    char_number = MPI_File_get_size(fh, &size);
    MPI_File_close(&fh);


    if (rank == 0) {

        for (int i = 0; i < numprocs; i++) {
            MPI_Recv(&char_number, i, MPI_INT, 0, 1, MPI_COMM_WORLD, &status);
        }
        cout << "There is: " << char_number << " characters in file.txt";
    }

    else {

        MPI_Send(&char_number, 0, MPI_INT, 0, 3, MPI_COMM_WORLD);

    }


    MPI_Finalize();

    return 0;
}

可能是你的断点还在列表中:

I deleted a breakpoint, but I continue to hit it when I start debugging again

If you deleted a breakpoint while debugging, in some cases you may hit the breakpoint again the next time you start debugging. To stop hitting this breakpoint, make sure all the instances of the breakpoint are removed from the Breakpoints window.

来源: https://msdn.microsoft.com/en-us/library/5557y8b4.aspx

我记得过去有一些可执行文件有类似的情况。从源代码中删除断点是不够的。

也可能是您正在尝试访问不存在的文件。

也可能是你的代码写得不太好

#include "mpi.h"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stack>

using namespace std;


int main(int argc, char *argv[])
{

    int   numprocs, rank;

    // buffer will keep input data
    char buffer[100] =  { 0 };

    // initialization of MPI world
    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &numprocs);

    MPI_Status status;
    MPI_File fh;
    MPI_Offset size;
    int char_number;

    // name of the file with data
    const char plik[10] = "file.txt";

    MPI_File_open(MPI_COMM_WORLD, plik, MPI_MODE_RDONLY, MPI_INFO_NULL, &fh);

    MPI_File_get_size(fh, &size);
    // we have to be careful here
    // in this sample we have strong assumption that size of data
    // divides without the reminder by number of processors!
    MPI_File_set_view(fh, rank*(size / numprocs), MPI_CHAR, MPI_CHAR, "native", MPI_INFO_NULL);
    MPI_File_read(fh, buffer, (size/numprocs), MPI_CHAR, &status);

    char_number = MPI_File_get_size(fh, &size);
    MPI_File_close(&fh);

    printf("My rank: %d - my data: %s\n", rank, buffer);

    if (rank == 0) {
        for (int i = 1; i < numprocs; i++) {
            MPI_Recv(&buffer[i*(size / numprocs)], (size/numprocs), MPI_CHAR, i, 0, MPI_COMM_WORLD, &status);
        }
        printf("I have collected data: %s\n",buffer);
    }

    else {
        MPI_Send(&buffer[0], rank*(size / numprocs), MPI_CHAR, 0, 0, MPI_COMM_WORLD);
    }

    MPI_Finalize();
    return 0;
}

对于输入文件

> cat file.txt
abcdefgh

按预期工作:

> mpirun -np 2 ./simple2
My rank: 0 - my data: abcd
I have collected data: abcdefgh
My rank: 1 - my data: efgh

问题是,这是否是您要查找的内容。