Я кодирую программу в C++ MPI, но, передавая большой файл как stdin
, я столкнулся с проблемой, что потоки не видят одну и ту же информацию stdin
.MPI и 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
Это из-за некоторых накладных расходов? Как я могу избежать этого?
Нам нужен более полный образец кода, чтобы действительно что-то сказать. Я предполагаю, что проблема состоит в том, что два цикла цикла не синхронизированы, поэтому некоторые из переменных обновляются, прежде чем они распространяются на другие потоки. Кроме того, это не проблема накладных расходов. – XapaJIaMnu
@XapaJIaMnu: Я уменьшил код до подмножества, показывая проблему. Я также вычитал инструкции препроцессора и инициализацию основной функции, которые, как я считаю, не являются релевантными. Могу ли я спросить, что вы подразумеваете под петлями, несинхронизированы? Разве они не выполняются локально и последовательно по каждому потоку? –
Хорошо, так это только код потока MPI? В этом случае я считаю, что проблема в цине, поскольку есть только один cin, из которого вы можете потреблять. Сколько строк вы ожидаете? – XapaJIaMnu