2017-08-24 98 views
0

我有使用兩個裝配的矩陣for循環的基礎上,從不同的庫基質,使用以下算法(此基於犰狳):矩陣減少,自定義減少運營商的OpenMP

inline void loop_over_matrix_serial(const size_t &size, arma::mat &matrix) 
{ 
    for (size_t i = 0; i < size; ++i) 
     for (size_t j = 0; j < size; ++j) 
      matrix(i, j) += position_function(i, j); 
} 

爲了爲了加速這一操作,我想使用OpenMP進行縮減。在其他問題中已經存在自定義簡化運算符,例如:C++ Armadillo and OpenMp: Parallelization of summation of outer products - define reduction for Armadillo matrix,但它的目標是完整的矩陣,而不是單個元素。我怎樣才能以所示方式爲所有矩陣定義一個自定義運算符,但是從不同的庫中爲減少呢?它將始終是從右側添加的雙值。

+2

我看不出在你的代碼中還原 - 只是將數組中的每個元素設置爲計算值。減少稱爲減少,因爲它們減少了從輸入到輸出的數據維度。因此,例如,'dot_product'將兩個向量縮減爲單個標量。二維結構上的逐行求和產生一維結構。 –

回答

-1

如果我要優化這段代碼,我會先了解矩陣的大小。

如果它很大,我會考慮寫一個緩存友好的代碼。

在你的情況下,如果你的幾個矩陣不能保存在緩存中,你也需要這樣做。請參閱此鏈接,What is "cache-friendly" code?

在緩存優化後,omp減少可能不那麼重要。