最近,我對計算機體系結構和性能領域產生了興趣。話雖如此,我一直在學習一種“更簡單”的匯編語言來真正嘗試學習東西是如何“在幕后作業”的。即MIPS 組件。我對嘗試和嘗試一些更高級的東西感到很自在,因此我決定將編程與我對數學的興趣結合起來。
我的目標很簡單,給定一個24x24(我不關心任何其他大小)矩陣A,我想撰寫一個演算法,盡可能高效地找到矩陣的上三角形式。高效我的意思是我希望最終處于使用處理器的狀態,我正在盡我所能使用資源。高速快取命中率、記憶體的有效使用(參考原則的區域性等)、運行解決方案所需的性能等。
最終,我的目標是將 C 解決方案轉換為 MIPS 程式集,并對其進行定制以適應我將嘗試在其上運行演算法的處理器的記憶體子系統。關于處理器,當涉及到快取、寫入緩沖區和記憶體時,我將有不同的選擇可以使用,因為我可以使用不同的快取大小、塊大小、關聯級別、記憶體訪問時間等。這種情況下的性能將以三角化 24x24 矩陣所需的時間來衡量。
首先,在深入研究 MIPS 匯編之前,我需要實際撰寫一些高級代碼并實際解決那里的問題。我“環顧四周”,最終想出了這個看似標準的解決方案。它不一定是超快的,我也不認為它是三角化 24x24 矩陣的最佳選擇。我能做得更好嗎?
void triangularize(float **A, int N)
{
int i, j, k;
// Loop over the diagonal elements
for (k = 0; k < N; k )
{
// Loop over all the elements in the pivot row and right of the pivot ELEMENT
for (j = k 1; j < N; j )
{
// divide by the pivot element
A[k][j] = A[k][j] / A[k][k];
}
// Set the pivot elements
A[k][k] = 1.0;
// Loop over all elements below the pivot right an right of the pivot COLUMN
for (i = k 1; i < N; i )
{
for (j = k 1; j < N; j )
{
A[i][j] = A[i][j] - A[i][k] * A[k][j];
}
A[i][k] = 0.0;
}
}
}
此外,在嘗試將 C 代碼轉換為 MIPS 程式集以最大化性能和最小化成本(快取命中率、處理記憶體時的 IO 成本等)以獲得閃電般快速和高效的解決方案時,我的下一步應該是什么?
uj5u.com熱心網友回復:
首先,將矩陣編碼為鋸齒狀陣列(即float**)通常效率不高,因為它會導致不必要的昂貴間接尋址,并且陣列可能在記憶體中不連續,從而導致更多的快取未命中甚至在病態情況下快取垃圾。將矩陣復制到連續的扁平陣列中當然更好。請考慮將您的矩陣存盤為通常更有效的扁平陣列(尤其是在 MIPS 上)。扁平化陣列可以使用類似的東西來索引,array[i*24 j]而不是array[i][j].
此外,如果您不關心 24x24 以外的矩陣,那么您可以為 24x24 矩陣撰寫專門的代碼。這有助于編譯器生成更高效的匯編代碼(通常通過展開回圈和使用更高效的指令,如乘以常數)。
此外,部門通常很昂貴,尤其是在嵌入式 MIPS 處理器上。因此,您可以用乘法代替除法。例如:
float inv = 1.0f / A[k][k];
for (j = k 1; j < N; j )
A[k][j] *= inv;
請注意,由于浮點舍入,結果可能會略有不同。-ffast-math如果您知道像 NaN 或 Inf 這樣的特殊值不會出現在矩陣中,則可以使用編譯器標志來幫助它生成此類優化。
此外,手動展開回圈可能會更快,因為并非所有編譯器都這樣做(正確)。話雖如此,回圈展開的好處很大程度上取決于目標處理器(此處未指定)。沒有更多資訊,很難知道這是否有用。例如,一些處理器可以在每個周期執行多個浮點運算,而另一些處理器甚至不能在本機執行該操作(即沒有硬體 FP 單元):它們以某種方式用許多非常昂貴的指令進行仿真(像 GCC 這樣的編譯器執行函式呼叫此類處理器上的加法/減法等基本操作)。如果沒有硬體 FP 單元,那么使用固定精度可能會更快。
最后,一些 MIPS 處理器具有 128 位SIMD 單元。使用它應該會顯著加快執行速度。編譯器應該能夠大部分地自動矢量化您的代碼,但您需要告訴他們您的目標處理器是否支持它(參見-marchGCC/Clang 的標志)。對于固定大小的矩陣,假設您撰寫了高效的代碼,手動矢量化通常會導致執行速度更快(比自動矢量化)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/466756.html
上一篇:在遞回中只應用一次條件
