簡體   English   中英

使用 openMP 並行化矩陣向量乘法的最佳方法

[英]Best way to Parallelizing matrix vector multiplication using openMP

我有以下代碼,我使用 openMP 對其進行了並行化:

#pragma omp parallel shared(matrix, result, vector) private(i, j)
  {
#pragma omp for schedule(static)
    for (i = 0; i < n; i++)
    {
      for (j = 0; j <= i && j < n; k++)
      {

        result[i] += matrix[i * n + j] * vector[j];
      }
    }
  }

我已將上述 pragma 指令添加到 for 循環中,它計算矩陣和列向量的乘積。 它確實加快了速度。 但是,有沒有更有效的方法來
使用 OpenMP 加快速度? 我嘗試了不同類型的計划靜態、動態、運行時、引導式、自動。 對於 30000 x 30000 大的矩陣,靜態和自動似乎給出了最好的結果。如果 j>i,矩陣具有矩陣 [i][j]=0 的屬性
  1. 如果使用局部臨時變量對j循環的結果求和,可能有助於編譯器優化代碼。 您的編譯器也可能會這樣做,但如果不這樣做,它會快得多。

  2. 始終在所需的最小范圍內使用變量,這也有助於編譯器進行優化。

  3. 確保您的編譯器可以有效地矢量化您的代碼:使用適當的編譯器標志,如果您使用指針,請通過使用restrict關鍵字或添加#pragma ivdep (英特爾編譯器)、 #pragma gcc ivdep告訴編譯器沒有循環攜帶依賴(GCC)、 #pargma loop(ivdep) (MSVC)、 #pragma clang loop vectorize(assume_safety) (clang) 在內循環之前。

所以,你的代碼應該是這樣的:

#pragma omp parallel for shared(matrix, result, vector) schedule(static)
    for (size_t i = 0; i < n; i++)
    {
      double sum=0;
      #pragma GCC ivdep
      for (size_t j = 0; j <= i; j++) //as suggested by @tstanisl
      {
        sum += matrix[i * n + j] * vector[j];
      }
      result[i] += sum;
    }
  }

暫無
暫無

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

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