2012-06-12 99 views
0

我有OpenMP的使用如何組織正確的並行程序輸出?

#pragma omp parallel for private(i) 
for (j=0;j<NUM_STEPS_J) { 

    for (i=0;i<NUM_STEPS_I;i++) { 

     std::cout << "Print some information about step i" << std::endl; 


    } 

    std::cout << "Check of item " << j << " finished" << std::endl; 
} 

什麼是提供在我的情況下,正確的輸出的最佳方式一樣的C++程序?

我知道,用「printf」代替「cout」解決了這個問題。

但是,當我將「cout」更改爲「printf」時,我的程序執行時間從約80秒增加到約120秒。 我認爲,這對程序的生產力有着足夠的影響。

解決這個問題沒有「printf」的最好方法是什麼?

是否可以在輸出過程中以某種方式鎖定「cout」功能?

+0

您可以考慮在運行時收集一些信息並以某種形式的數據結構存儲它。然後在運行後打印報告。這樣你就不會將你的計算和printint輸出混合在一起。當然,你不會更新「現場」。 – Matthias

+0

是的,當然這是最有效的方法。但主要想法是在運行時打印這些信息。在其他情況下,信息「std :: cout <<」檢查項目「<< j <<」已完成「<< std :: endl;」是無意義的,我可以刪除它,並使用「#pragma omp critical」作爲「std :: cout <<」打印有關step i「std :: endl;」的一些信息 –

回答

2

我會很驚訝地看到printf比輸入輸出流慢...(更多這樣考慮您正在使用std::endl迫使緩衝的沖洗),但無論如何,你可以使用一個stringstream構造輸出在一次,然後用已建好的線路調用printfstd::cout <<一次。

+0

我也很驚訝:) –

+0

如果我理解正確,以這種方式使用std :: cout「std :: cout << String << std :: endl」將永遠不會在並行輸出期間導致錯誤的輸出? –

+0

@LuckyMan:是的,但是我會把'\ n''附加到'String',並將'std :: endl'改成'std :: flush'(如果你真的需要刷新)。這樣,連續調用兩個'operator <<'的競爭條件不會影響輸出。通過使用'std :: endl;'你將新行綁定到第二個調用,另一個寫在中間的線程將寫入同一行(後面跟着兩個換行符),你可能想避免這一行。 –