2017-03-02 85 views
1

這是一個在openmp c中轉置矩陣的程序,我用的編譯器是gcc。 我試了私人(我,j)和私人(我)分開。因爲它是線程的,我無法找到準確發生的變化。private(i,j)在這段代碼中的作用是什麼?如果我從私人(i,j)省略i或j,會有什麼變化嗎?

#pragma omp parallel for private (i,j) 
    for(i=1; i<size; i++) 
{ 
#pragma omp parallel for 
    for(j=0; j<i; j++) 
     { 
     temp = mat1[i][j]; 
      mat1[i][j] = mat1[j][i]; 
      mat1[j][i] = temp; 
     } 
} 

運行時間每次都不一樣。儘管我有雙核心,但我嘗試了5線程。謝謝。

+0

請參閱http://stackoverflow.com/q/37845291/620382 – Zulan

+2

我會更擔心temp的private/shared屬性。 –

+0

您是否設置了OMP_NESTED?如果沒有,那麼內部並行就會被忽略(這可能是你想要的:-)),如果你有,那麼你可能會超出你的要求! (開始25個線程)。你最好採用一種在最小範圍內聲明變量的風格。那麼你不必擔心私人在這裏。 –

回答

1

private(i,j)在這段代碼中的作用是什麼?

無。

如果我從private(i,j)中省略i或j,會有什麼變化嗎?

沒有,因爲OpenMP的指定

在關聯for循環一個forparallel fortaskloop,或distribute構建體(多個)的循環迭代變量(s)爲(是) 私人的。

您不需要明確聲明迭代變量爲private,並且這樣做不會改變任何內容。通常,您不得爲具有數據共享屬性的變量聲明數據共享屬性,但對於冗餘屬性聲明的某些情況(包括該屬性聲明),OpenMP會作出特殊例外。

相關問題