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