簡體   English   中英

For循環(C ++)中的OpenMP並行節-開銷

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM