私は 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);
}
}