簡體   English   中英

對於矩陣初始化,openmp比串行慢

[英]openmp is slower than serial for matrix initialization

我只是在學習如何使用openmp,但是通過執行以下操作會使其變慢。 基本上,我只是試圖初始化一個巨大的二維矩陣。

219     int **scoreMatrix = malloc(sizeof(int *) * (strlen(seq1)+1));
220 
221     int i,j = 0;
222     omp_set_num_threads(6);
224 #pragma omp parallel private(i,j) 
225 {
226     int std = omp_get_thread_num();
227     //Initialize matrix
228     for(i = std; i < strlen(seq1)+1; i=i+nthreads){
229         scoreMatrix[i] = malloc(sizeof(int) * (strlen(seq2)+1));
230         for(j = 0; j < strlen(seq2)+1; j++){
231             scoreMatrix[i][j] = 0;
232         }
233     }
234 }

請告訴我OpenMP中是否缺少任何重要的語法或概念。 謝謝!

自從我上次使用OpenMP以來已經有一段時間了,您的問題很可能歸結為開銷,並且每個線程完成的工作都非常小。 您需要每個線程設置執行1/6的malloc和1/6的設置為0。對於這樣的問題,您應該考慮seq1和seq2的大小以及實際上並行執行的工作量。 例如,由標准malloc進行的內存分配可能是一個爭用點,例如,請參閱此問題並進行更詳細的分析。 如果大部分工作是由malloc完成的,因此不能在很大程度上並行執行,那么您就不會為支付線程初始化的開銷而獲得很大的提速。 如果確實需要它,則可以通過使用其他分配器獲得改進。 將內存區域設置為0可以在線程之間進行拆分,但是與分配相比,幾乎可以肯定這是非常快的。 由於在線程之間共享高速緩存行,因此在行229上設置scoreMatrix [i]可能還會有一些高速緩存一致性開銷。

使用OpenMP和MPI時,請務必記住,簡單地啟動並行計算部分會涉及開銷,因此,即使工作量很高的塊,即使它們可能高度並行,也可能不值得並行化。 當您開始對數組進行計算時,您很有可能會看到好處。

通常,要將內存清零,最好的選擇是記憶集,但編譯器可能會優化第230和231行以執行類似的操作。

您最好讓#mpgma #pragma omp parallel for

int **scoreMatrix = malloc(sizeof(int *) * (strlen(seq1)+1));

int i,j = 0;
omp_set_num_threads(6);

#pragma omp parallel for private(i,j) 
for(i = 0; i < strlen(seq1)+1; ++i){
    scoreMatrix[i] = malloc(sizeof(int) * (strlen(seq2)+1));
    for(j = 0; j < strlen(seq2)+1; ++j){
        scoreMatrix[i][j] = 0;
    }
}

這可能會產生影響,具體取決於openmp處理線程占用的程度。

暫無
暫無

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

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