Как читать разные интервалы строк из текстового файла в разных процессах, используя MPI в C - PullRequest
0 голосов
/ 06 марта 2020

Я пытаюсь разделить 1 миллион строк чисел с плавающей точкой на 16 различных процессов. Например, процесс 0 должен читать между строками 1-62500, а процесс 1 - читать между строками 62501-125000 et c.

Я пробовал следующий код, но каждый процесс читает строки между 1 -62500. Как я могу изменить интервал строки для каждого процесса?

MPI_Init(NULL, NULL);

n=1000000/numberOfProcesses;

FILE *myFile;

myFile = fopen("input.txt","r");
i=0;
k = n+1;
while(k--){
    fscanf(myFile,"%f",&input[i]);
    i++;
}
fclose(myFile);

MPI_Finalize();

1 Ответ

1 голос
/ 06 марта 2020

Предполагая numbeOfProcesses=4 и numberOfLines=16

//so new n will be 4
//n=1000000/numberOfProcesses;
n=numberOfLines/numbeOfProcesses
FILE *myFile;

myFile = fopen("input.txt","r");
i=0;
k = n+1 //(5)

Из вашей программы все процессы будут считывать файл из одного и того же местоположения или смещения. Вам нужно сделать так, чтобы каждый процесс считывался с их собственной заданной c строки или смещения. Например, ранг 0 следует читать из 0, ранг 1 из n, ранг 2 из 2*n et c. Передайте это как параметр в fseek.

n=numberOfLines/numbeOfProcesses
MPI_Comm_rank(MPI_COMM_WORLD,&rank)
file_start= n*rank
fseek(myfile, file_start, SEEK_SET);

fseek будет go смещение (file_start) файла. Тогда file_start будет 4 для rank 0, 8 для rank 1 et c ...

Также, в то время как l oop следует изменить соответствующим образом.

Как указывалось в комментариях @ Gilles , здесь мы явно предполагаем количество строк в файле. Это может привести ко многим проблемам.

Чтобы получить масштабируемость и параллельную производительность , лучше использовать MPI IO , который предлагает отличные функции для параллельных файловых операций. MPI IO разработан для этого вида использования.

...