0

私は MPI の新しい学習者です。MPI_File_read_at() を使用して、txt ファイルからデータを 1 行ずつ読み取りたいと思います。各行の長さは異なるため、1行を読んでいる(バッファの長さを設定している)と、次の行も読み取られ、次の行の一部がバッファに送信され、実際に問題が発生することがあります...それで、MPI_File_read_at() を使用してデータを 1 行ずつ読み取る方法はあるのでしょうか? 各行の最後に「\n」があると停止しますか? または、 MPI_File_read_at() 以外の MPI 関数を使用して、データを 1 行ずつ読み取るためのより良い提案はありますか?

私の質問は、MPI_File_read_at() を使用して fgets と同じことを行う方法だと思います

/*the traditional way to read a file line by line:*/
for(i=0;i<nlens;i++)
{
    fgets(line, 20, fp);
    sscanf(line,"%d%d",&e1,&e2);
}


/*the way I am doing this by MPI*/

int offset = 0;
int count = 15;
char line[15];
for(i=0;i<nlens;i++)
{
    offset=i*count;
    MPI_File_read_at(fp, offset, line, count, MPI_CHAR, &status);
    printf("line%d:/n%s/n",i,line);
}

/*So, if I have a file looks like:*/
0        2
0        44353
3        423
4        012312
5        2212
5        476

/*the output of mpi version  will be:*/
line0: 
0        2
0
line1:
      44353
3
line2:
      423
4
line3:
    012312
5
line4:
      2212
5
line5:
     476
2
5

void read_data(char address_data[], int num_edges, int link[][100])
{
    int i,e1,e2;
    FILE *fp;
    char line[30];

    int totalTaskNum, rankID;
    MPI_Comm_rank(MPI_COMM_WORLD, &rankID);
    MPI_Comm_size(MPI_COMM_WORLD, &totalTaskNum);
    MPI_Status status;
    if(rankID == 0)  /*to avoid different processors access to the file simultaneously*/
    {
        fp = fopen(address_data, "r");
        for(i=0;i<num_edges;i++)
        {
            fgets(line, 20, fp);
            sscanf(line,"%d%d",&e1,&e2);
            link[e1][e2]++;
        }
        fclose(fp);
    }
}
4

1 に答える 1