2016-05-30 3 views
0

Я использую openmp для параллелизации цикла for, который вычисляет некоторые значения, и я хочу записать результаты в один выходной файл (порядок не имеет значения). упрощенная версия кода, который я использую, следующая:выходной файл с использованием openmp for loop

#pragma omp parallel for schedule(dynamic) 
for(n=0; n<M; n++){ 
// calculate some parameters, e.g. a,b,c,d 
// now write them in the output file which is already opened using the config.dat file 
outfile << setprecision(8) << a << ", " << b << ", " << c << ", " << d << "\n"; 
} 

outfile.close(); 

большую часть времени я получаю правильный выходной_файл, но иногда я ломаные линии в OUTFILE или несколько строк, кажется, перепутать который я предполагаю, из-за того, что более чем одно ядро ​​попытаться написать в выходной файл в одно и то же время. Я был бы очень благодарен, если кто-нибудь скажет мне, как решить эту проблему.

+1

wrap 'outfile << ...' с '#pragma omp critical' –

+0

См. [Этот ответ] (http://stackoverflow.com/a/33665044/5239503) для объяснения того, что происходит и как исправить Это. – Gilles

ответ

0

Как написано в одном из комментариев, вам понадобится мьютекс.

Однако, если вы собираетесь сбросить большие объемы данных, используя

#pragma omp critical 

может иметь большое влияние на производительность.

Рассмотрите решение, в котором каждый поток хранит X строк в приватном буфере и выгружает их все в файл в одной партии.

Смежные вопросы