[英]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];
}
}
}
如果使用局部臨時變量對j
循環的結果求和,可能有助於編譯器優化代碼。 您的編譯器也可能會這樣做,但如果不這樣做,它會快得多。
始終在所需的最小范圍內使用變量,這也有助於編譯器進行優化。
確保您的編譯器可以有效地矢量化您的代碼:使用適當的編譯器標志,如果您使用指針,請通過使用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.