2015-07-08 3 views
0

Я кодирую программу в 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 

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

+0

Нам нужен более полный образец кода, чтобы действительно что-то сказать. Я предполагаю, что проблема состоит в том, что два цикла цикла не синхронизированы, поэтому некоторые из переменных обновляются, прежде чем они распространяются на другие потоки. Кроме того, это не проблема накладных расходов. – XapaJIaMnu

+0

@XapaJIaMnu: Я уменьшил код до подмножества, показывая проблему. Я также вычитал инструкции препроцессора и инициализацию основной функции, которые, как я считаю, не являются релевантными. Могу ли я спросить, что вы подразумеваете под петлями, несинхронизированы? Разве они не выполняются локально и последовательно по каждому потоку? –

+0

Хорошо, так это только код потока MPI? В этом случае я считаю, что проблема в цине, поскольку есть только один cin, из которого вы можете потреблять. Сколько строк вы ожидаете? – XapaJIaMnu

ответ

1

Хорошо, так что в основном ваша проблема в том, что все ваши темы потребляют линии от cin и они участвуют в гонке. Несмотря на то, что cin дает некоторые гарантии безопасности потоков в целом, вы не всегда уверены в том, что получите. Проверьте эту резьбу: How do scanf(), std::cin behave on multithreaded environment?

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

+0

Спасибо за предложение решения. Я пошел на второй и транслировал его с помощью 'MPI_Bcast', хотя мне пришлось использовать промежуточный' char * '. Я действительно новичок в MPI (начался сегодня, если честно), следует ли использовать MPI_Barrier вместо вызовов 'sleep', чтобы потоки ждали друг друга? –

+1

Вы не должны использовать сон в многопоточной среде. Всегда барьеры, это правильная синхронизация. – XapaJIaMnu