簡體   English   中英

C#中的矩陣乘法

[英]Matrix multiplication in C#

我在將兩個尺寸為5000x1024的矩陣相乘時遇到問題。 我試圖以常規方式通過循環來完成此操作,但是這要花很多時間。 是否有任何具有已實現和優化的矩陣運算的好的庫,或者沒有沒有3個循環的算法?

您是否考慮過使用OpenCL? Cloo(C#OpenCL庫)分發中的示例之一是大型2D矩陣乘法。

與CUDA不同,OpenCL內核將在您的GPU(如果可用和受支持)或CPU上運行。 在GPU上,您會看到非常非常快的速度提升。 我的意思是, 確實非常引人注目,大約10倍至100倍,具體取決於內核的效率和GPU的內核數量。 (基於費米的NVidia卡的容量為384-512,而新的600卡的容量為1500。)

如果您對沿途不感興趣-盡管正在執行數字密集型,可輕松並行化的操作的任何人都應使用GPU-請確保至少使用C#的內置並行化:

Parallel.For(
  0
  ,5000
  , (i) => { 
    for(var j=0;j<1024;j++)
    {
      result[i,j] = .....
    }
);

另外,請查看GPU.NET和Brahma。 Brahma允許您使用LINQ在C#中構建OpenCL內核。 絕對降低學習曲線。

看一看Strassen算法 ,它的運行時間約為 用天真矩陣相乘的方法,用O(n 2.8 )代替O(n 3 )。 一個問題是,它並不總是穩定的,但是對於非常大的尺寸卻可以正常工作。 此外,它確實很復雜,因此我建議您重新考慮您的設計,並可能減小矩陣的大小或將問題分解為較小的部分。

但請記住,幾乎沒有優化沒有特殊屬性的矩陣乘法(如提到的Aidan )。 這是一個例子: Coppersmith-Winograd算法的取值為O(n 2.3737 ),它是迄今為止矩陣乘法的最佳算法之一! 最好的選擇是使用OpenCL和GPU( David提到),或者使用包numpy查看其他優化的編程語言,例如Python。

祝你好運!

暫無
暫無

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

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