[英]OpenMP Parallel Sections Within For Loop (C++) - Overhead
我一直在進行量子模擬。 每次計算勢函數時,迭代求解器的一個步驟,然后執行一系列測量。 這三個過程很容易並行化,並且我已經確保它們不會相互干擾。 另外,有些事情相當簡單,但不應並行進行。 設置概述如下所示。
omp_set_num_threads(3);
#pragma omp parallel
{
while (notDone) {
#pragma omp sections
{
#pragma omp section
{
createPotential();
}
#pragma omp section
{
iterateWaveFunction();
}
#pragma omp section
{
takeMeasurements();
}
}
#pragma omp single
{
doSimpleThings();
}
}
}
該代碼工作正常! 我看到速度提高了,這主要與TDSE求解器一起運行的測量有關(速度提高了約30%)。 但是,該程序從使用大約10%的CPU(大約一個線程)變為35%(大約三個線程)。 如果潛在函數,TDSE迭代器和測量花費了同樣長的時間,但它們卻沒有花費那么長的時間,這將是有意義的。 基於速度的提高,我希望CPU使用率大約為15%。
我感覺這與在while循環中運行這三個線程的開銷有關。 更換
#pragma omp sections
與
#pragma omp parallel sections
(並在循環之前省略兩行)沒有任何改變。 有沒有更有效的方法來運行此設置? 我不確定線程是否在不斷地被重新創建,或者在等待其他線程完成時線程是否占用了整個內核。 如果我將線程數從3增加到其他任何數目,該程序將使用所需的盡可能多的資源(可能是所有CPU),並且不會獲得性能提升。
我嘗試了許多選項,包括使用任務代替節(具有相同的結果),切換編譯器等。正如Qubit所建議的,我還嘗試使用std :: async。 這就是解決方案! CPU使用率從大約50%下降到30%(這與原始帖子使用的計算機不在同一台計算機上,因此數字有所不同-基本上是1.6倍CPU使用率的1.5倍性能提升)。 這更接近我對這台計算機的預期。
供參考,這是新的代碼概述:
void SimulationManager::runParallel(){
auto rV = &SimulationManager::createPotential();
auto rS = &SimulationManager::iterateWaveFunction();
auto rM = &SimulationManager::takeMeasurements();
std::future<int> f1, f2, f3;
while(notDone){
f1 = std::async(rV, this);
f2 = std::async(rS, this);
f3 = std::async(rM, this);
f1.get(); f2.get(); f3.get();
doSimpleThings();
}
}
使用std :: async調用這三個原始函數,然后使用將來的變量f1,f2和f3將所有內容收集回單個線程中,並避免訪問問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.