MPI导致断点

时间:2018-01-21 20:27:56

标签: c++ visual-studio mpi

我已经创建了一个使用MS MPI计算字符数的应用程序,但它会导致4个断点: /a/b/c/d/e/...MPI_File_get_sizeMPI_File_set_view,再次MPI_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;
}

1 个答案:

答案 0 :(得分:1)

可能你的断点仍在列表中:

  

我删除了一个断点,但是当我开始时我会继续打它   再次调试

     

如果在调试时删除了断点,在某些情况下   在下次启动时你可能再次点击断点的情况   调试。要停止点击此断点,请确保所有断点   断点的实例将从“断点”窗口中删除。

来源: 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

问题是,这是否是您正在寻找的。