使用各類方法加速大型矩陣運算的效率對比

     並行程序設計這門課程的課程實驗要求我分別使用串行, 並行+分塊算法, 並行+分塊+SSE指令集加速, CUDA等四種方法來計算矩陣乘法.算法

     還真別說收穫蠻大的.windows

     個人配置是i5 3470+GTX660Ti多線程

     下面的表格是各類算法下的狀況.spa

矩陣規模 串行 多線程+分塊 多線程+分塊+SSE CUDA
512 572.2(ms) 169.7(ms) 21.8(ms) 351.5(ms)
1024 11295.9(ms) 1367.1(ms) 134.5(ms) 395.5(ms)
2048 142193.0(ms) 10445.7(ms) 1118.3(ms) 1051.4(ms)
4096 1213014.6(ms) 81608.3(ms) 8737.2(ms) 6197.3(ms)

     從圖中明顯能夠看出, 這個分塊以後cache利用效率大大提升,原本若是普通多線程相對於串行來講不過 4倍,可是這裏速度達到了10倍多. 也就是說CPU Cache的合理利用很是有用.操作系統

     SSE的加速效果就很是厲害了, 相對於分塊又提升了10倍的速度.不過 SSE的浮點數運算準確度好低啊!!!!! 偏差超級大. 可是矩陣的每一個點偏差又只有1點幾. 可是每一個點都有1點幾, 結果矩陣的全部點的偏差之和就看起來簡直不堪入目.線程

     CUDA的效果簡直很是拔羣. 並且時間還包括了傳輸數據到顯卡的時間.設計

    

     哦,說些閒話. code

     CUDA的設備變量的地址是分配在操做系統的kernel層的,直接訪問會致使memory access violate錯誤. blog

     好比ip

    

     Matrix A{ int w;int h; float *d;};

     Matrix * A;

     cudaMalloc((void**)&A,sizeof(Matrix));

     A->w = 16;   //這裏會出錯.!!!


      還有,在運行CUDA程序時, Win 8 會有顯卡超時設置,若是你的CUDA程序時間運行過久,顯卡會失去響應,而後windows就自動對顯卡重置. 你的屏幕右下角會出現說,顯卡驅動已中止響應,自動恢復的錯誤. 你的CUDA程序會返回編號爲30的UnkownError類型.

      須要在註冊表裏 設置 關閉windows TDR 或者加長延時上限.

具體參考

http://stackoverflow.com/questions/13177214/disabling-tdr-for-cuda-in-windows-8

http://msdn.microsoft.com/en-us/Library/Windows/Hardware/ff569918(v=vs.85).aspx

 

代碼地址 http://files.cnblogs.com/tlm1992/matrix_product.zip

相關文章
相關標籤/搜索