簡體   English   中英

基於線程數量與執行時間的關系的OpenMP並行編程

[英]OpenMP parallel programming based on number of threads relation with execution time

我在Visual Studio 2010中有以下代碼:

#pragma omp parallel for num_threads(1)
for(int y=0;y<col;y++)
bands[parametersnumberPredictionBands+1][x][y] = hyperspectral[x][y][z];

num_threads(1)小於num_threads(3)時執行代碼所需的時間。

據我了解,當並行使用更多線程時,應該減少花費的時間。 誰能解釋為什么?

我是一個初學者,因此非常感謝您的幫助。

創建和銷毀線程需要一些時間。 當每個線程完成的工作都很瑣碎時,創建和銷毀線程所花費的時間就超過了完成工作本身所花費的時間。

而是嘗試運行類似

const int N = 100000;
int A[N];
#pragma omp parallel for
for (int i = 0; i < N; i++) {
    A[i] = i;
}

在這里,使用3個線程花費的時間將大大減少,因為完成的工作量超過了創建和銷毀每個線程的工作量。

也許更清楚地看到這一點,另一個例子會有所幫助。 假設我們要並行化一個迭代10次的循環,每次迭代需要1秒,創建的每個其他線程都需要0.5秒。

一個線程將在10秒內完成任務。 如果我們創建另一個線程,則可以將工作時間減半,從而只需5秒鍾的工作。 但是創建額外的線程需要0.5秒,因此總運行時間為5.5秒。 它仍然比原始速度快,但是線程數量加倍並沒有使我們的運行時間減半

可以說,我們想真正快速地運行循環,並創建9個額外的線程,總共10個線程。 現在可以將工作時間分配到所有10個線程中,從而導致工作時間為1秒。 但是,創建9個線程需要4.5秒。 現在,我們的總運行時間為5.5秒,這與僅2個線程運行相同! 創建線程的開銷超過了要完成的工作量。 在這一點上繼續添加線程只會減慢我們的程序速度。

本質上,對於所有具有固定工作量的程序而言,更多線程將不會加速運行時間。 大量的工作量超過了為大量線程創建線程的成本。 較小的工作負載幾乎立即與線程創建開銷相形見.。

TL; DR

並行處理最適合大問題。 並行化瑣碎的問題只會使它們變慢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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