簡體   English   中英

iOS 4使用4x4矩陣加速Cblas

[英]iOS 4 Accelerate Cblas with 4x4 matrices

我一直在研究在iOS 4中提供的Accelerate框架。具體來說,我嘗試在C中的線性代數庫中使用Cblas例程。現在我無法使用這些函數給我在非常基本的例程中獲得任何性能提升。 具體來說,是4x4矩陣乘法的情況。 無論何時我無法利用矩陣的仿射或同質性質,我一直在使用這個例程(刪節):

float *mat4SetMat4Mult(const float *m0, const float *m1, float *target) {
    target[0] = m0[0] * m1[0] + m0[4] * m1[1] + m0[8] * m1[2] + m0[12] * m1[3];
    target[1] = ...etc...
    ...
    target[15] = m0[3] * m1[12] + m0[7] * m1[13] + m0[11] * m1[14] + m0[15] * m1[15];
    return target;
}

Cblas的等效函數調用是:

cblas_sgemm(CblasColMajor, CblasNoTrans, CblasNoTrans,
   4, 4, 4, 1.f, m0, 4, m1, 4, 0.f, target, 4);

比較兩者,通過使它們運行大量充滿隨機數的預先計算的矩陣(每個函數每次都獲得完全相同的輸入),當使用C clock()函數計時時,Cblas例程執行速度大約慢4倍。

這對我來說似乎不對,而且我感覺我在某處做錯了什么。 我是否必須以某種方式啟用設備的NEON設備和SIMD功能? 或者我不希望用這么小的矩陣獲得更好的性能?

非常感謝,

巴斯蒂安

Apple WWDC2010的演示文稿表示,即使是3x3矩陣操作,Accelerate仍然應該加速,所以我認為你應該看到4x4略有改進。 但是你需要考慮的是Accelerate&NEON旨在大大加速整數運算,但不一定是浮點運算。 您沒有提到您的CPU處理器,而且似乎Accelerate將使用NEON或VFP進行浮點運算,具體取決於您的CPU。 如果它使用NEON指令進行32位浮點運算,那么它應該運行得很快,但是如果它使用VFP進行32位浮點運算或64位雙運算,那么運行速度非常慢(因為VFP實際上不是SIMD)。 因此,您應該確保使用Accelerate進行32位浮點運算,並確保它將使用NEON而不是VFP。

另一個問題是即使它確實使用了NEON,也不能保證你的C編譯器會生成比沒有NEON指令的簡單C函數更快的NEON代碼,因為GCC之類的C編譯器經常生成可怕的SIMD代碼,可能會運行得更慢比標准代碼。 這就是為什么它總是很重要的是測試生成的代碼的速度,並可能手動查看生成的匯編代碼,看看你的編譯器是否生成了錯誤的代碼。

BLAS和LAPACK庫設計用於我認為的“中到大矩陣”(一邊從幾十到幾萬)。 它們將為較小的矩陣提供正確的結果,但性能不會盡可能好。

有幾個原因:

  • 為了提供最佳性能,必須內聯3x3和4x4矩陣操作,而不是在庫中; 進行函數調用的開銷太大而無法克服,因為要完成的工作很少。
  • 一組完全不同的接口是提供最佳性能所必需的。 用於矩陣乘法的BLAS接口采用變量來指定計算中涉及的矩陣的大小和前導維度,更不用說是否轉置矩陣和存儲布局。 所有這些參數使庫變得強大,並且不會損害大型矩陣的性能。 但是,當它完成確定您正在進行4x4計算時,專用於執行4x4矩陣運算的功能已經完成。

這對您意味着什么:如果您希望提供專用的小矩陣操作,請訪問bugreport.apple.com並提交請求此功能的錯誤。

暫無
暫無

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

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