使用各种方法加速大型矩阵运算的效率对比
?????并行程序設(shè)計這門課程的課程實(shí)驗(yàn)要求我分別使用串行,?并行+分塊算法,?并行+分塊+SSE指令集加速,?CUDA等四種方法來計算矩陣乘法.
?????還真別說收獲蠻大的.
???? 我的配置是i5 3470+GTX660Ti
?????下面的表格是各種算法下的情況.
| 矩陣規(guī)模 | 串行 | 多線程+分塊 | 多線程+分塊+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倍,但是這里速度達(dá)到了10倍多.?也就是說CPU?Cache的合理利用非常有用.
?????SSE的加速效果就非常厲害了,?相對于分塊又提高了10倍的速度.不過?SSE的浮點(diǎn)數(shù)運(yùn)算準(zhǔn)確度好低啊!!!!!?誤差超級大.?但是矩陣的每個點(diǎn)誤差又只有1點(diǎn)幾.?但是每個點(diǎn)都有1點(diǎn)幾,?結(jié)果矩陣的所有點(diǎn)的誤差之和就看起來簡直不堪入目.
?????CUDA的效果簡直非常拔群.?而且時間還包括了傳輸數(shù)據(jù)到顯卡的時間.
????
?????哦,說些閑話.?
???? CUDA的設(shè)備變量的地址是分配在操作系統(tǒng)的kernel層的,直接訪問會導(dǎo)致memory access violate錯誤.?
?????比如
????
Matrix A{ int w;int h; float *d;};Matrix * A;cudaMalloc((void**)&A,sizeof(Matrix));A->w = 16; //這里會出錯.!!!
??????還有,在運(yùn)行CUDA程序時,?Win 8?會有顯卡超時設(shè)置,如果你的CUDA程序時間運(yùn)行太久,顯卡會失去響應(yīng),然后windows就自動對顯卡重置.?你的屏幕右下角會出現(xiàn)說,顯卡驅(qū)動已停止響應(yīng),自動恢復(fù)的錯誤.?你的CUDA程序會返回編號為30的UnkownError類型.
??????需要在注冊表里?設(shè)置?關(guān)閉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
????
?
轉(zhuǎn)載于:https://www.cnblogs.com/tlm1992/p/3650214.html
總結(jié)
以上是生活随笔為你收集整理的使用各种方法加速大型矩阵运算的效率对比的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdfs_1
- 下一篇: interrupt 1 using 1