簡體   English   中英

並行嵌套循環,但按順序輸出結果

[英]Parallel Nested For Loop but Output Results in Order

試圖減少我正在研究的程序的時間。 下面是我的代碼的一部分,其中元素之間相互比較以進行計算。 然后將該計算結果打印到控制台。

#pragma omp parallel for
for (int i = 0; i < numberOfStuff - 1; i++) {
    /*
    [10]
    */
    for (int j = i + 1; j < numberOfStuff ; j++) {
        double calc= stuffCompared(b[i], b[j]);
        printf("%2d %2d -> %.20lf\n", i, j, calc);
    }
}

我的問題是嘗試在控制台上按順序打印這些結果,但同時也減少了我的程序運行所花費的時間。

我試過將結果存儲到數組中。 在控制台上打印時,這對預期的性能時間而言是昂貴的。 我還嘗試使用如下所示的omp命令...

#pragma omp parallel for ordered
...
#pragma omp ordered
printf("%2d %2d -> %.20lf\n", i, j, calc);

...對於printf,但是發現它並不總是產生我可以順序實現的有序結果,但是產生了更好的時間性能。

由於我是OpenMP和並行編程的新手,因此對此提供的任何幫助將不勝感激。

您還必須執行fflush(stdout); 在有序構造中以確保順序輸出。 說:

我試過將結果存儲到數組中。 在控制台上打印時,這被證明對執行時間造成了高昂的代價

這是沒有道理的。 將元素存儲在內存中的速度比格式化輸出要快得多,因此將結果存儲在中間數組中會對性能產生顯着影響。 在工作中還必須有其他效果。 內存布局/錯誤共享可能存在問題,但與printf相比,即使這樣也沒關系。 我強烈建議您遵循這條路線,並嘗試找出問題所在。

特別感謝Zulan告訴我我絕對是錯的。 在問這個問題之前,我進行了進一步的探索並意識到了我以前的錯誤。

此答案適用於其他有類似問題或尋求類似解決方案的人。

我使用向量進行計算,並利用i和j來分配計算的存儲位置,如下所示。

std::vector<double> calc;
int vectorSize = (numberOfStuff * numberOfStuff) - numberOfStuff;
calc.resize(vectorSize);

#pragma omp parallel for
for (int i = 0; i < numberOfStuff - 1; i++) {
    for (int j = i + 1; j < numberOfStuff; j++) {
        calc[(i * 10) + j] = CompareStuff(b[i], b[j]);
    }
}

// Print
for (int i = 0; i < numberOfStuff - 1; i++) {
    for (int j = i + 1; j < numberOfStuff ; j++) {
        printf("%2d %2d -> %.20lf\n", i, j, calc[(i * 10) + j]);
    }
}

使用omp在for循環中並行執行計算。 完成后,新的for循環將按順序打印結果。

重要的是,運行我的程序的時間仍然是16到17秒,但現在結果是正常的。

暫無
暫無

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

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