MPI и stdin накладные расходы?

Я кодирую программу в C ++ MPI, но при передаче большого файла как stdin Я сталкиваюсь с проблемой, что потоки не видят то же самое stdin Информация.

Более подробно, я передаю в качестве стандартного ввода список входных файлов, который затем сохраняется в vector<string>:

MPI_Init(NULL,NULL);
int CORES, thread;
MPI_Comm_size(MPI_COMM_WORLD,&CORES);
MPI_Comm_rank(MPI_COMM_WORLD,&thread);
stringstream tline;
int count = 0;
for (std::string line; std::getline(std::cin, line);){
tline << line << " ";
count++;
}

vector<string> args(count,"");
for(int i = 0; i < count; i++)
tline >> args[i];

cout << thread << " " << count << endl; //each thread outputs the number of input files it received

Моя проблема в том, что это дает разные номера для разных потоков. Например, после передачи файла из 10 000 строк, я получаю:

5 9464
6 9464
3 9464
4 9464
1 9554
2 9554
0 10000
7 9464

Это из-за некоторых накладных расходов? Как я могу избежать этого?

0

Решение

Итак, в основном ваша проблема в том, что вы все ваши потоки потребляют строки из CIN и они мчатся. Даже если CIN дает некоторые гарантии безопасности потоков в целом, вы не всегда уверены, что вы получите. Проверьте эту тему: Как scanf (), std :: cin ведут себя в многопоточной среде?

Решение: не используете CIN? Используйте файл и пусть каждый поток открывает файл самостоятельно с помощью дескриптора файла. Если вы действительно хотите использовать CIN тогда есть один поток из MPI читать CIN и транслировать его в другие потоки, а затем они могут все, что они хотят с ним.

1

Другие решения


По вопросам рекламы [email protected]