分別用CUDA和JAVA製作兩個三層的n*m*k的神經網絡,使輸入一致,目標函數一致,迭代次數一致,通過調節節點數量測量時間比較這兩個網絡到底哪個快。
網絡的輸入節點的初始化方式爲
for(inta=0 ;a<n ;a++)
{
x[a]=(double)a/(n);
}
目標函數y[0]=1;y[1]=0;
權重都初始化爲0.1,用隨機梯度下降,不用偏置
迭代次數都是100次。
得到表格
節點數量 | 網絡結構 | 迭代次數 | java用時 | y[0] | y[1] | CUDA用時 | y[0] | y[1] | java用時/CUDA用時 | java速度/CUDA速度 |
600 | 3*100*2 | 100 | 47 | 0.9999999960729808 | 2.048728729816881E-211 | 657 | 0.9999999960729809 | 0 | 0.071537291 | 13.9787234 |
3000 | 3*500*2 | 100 | 62 | 0.9999999999505671 | 0 | 641 | 0.9999999999505671 | 0 | 0.096723869 | 10.33870968 |
20000 | 100*100*2 | 100 | 62 | 0.9999917229035667 | 0 | 751 | 0.9999917229035668 | 0 | 0.082556591 | 12.11290323 |
400000 | 1000*200*2 | 100 | 296 | 0.9999999979392669 | 0 | 1532 | 0.9999999979392669 | 0 | 0.193211488 | 5.175675676 |
2400000 | 4000*300*2 | 100 | 2532 | 0.9999999999999065 | 0 | 6958 | 0.9999999999999065 | 0 | 0.363897672 | 2.748025276 |
24000000 | 4000*3000*2 | 100 | 56305 | 1 | 0 | 74692 | 1 | 0 | 0.753829058 | 1.326560696 |
24000000 | 4000*3000*2 | 100 | 56415 | 1 | 0 | 74317 | 1 | 0 | 0.759112989 | 1.317326952 |
40000000 | 5000*4000*2 | 100 | 97646 | 1 | 0 | 128027 | 1 | 0 | 0.762698493 | 1.311134097 |
40000000 | 5000*4000*2 | 100 | 97531 | 1 | 0 | 127416 | 1 | 0 | 0.765453318 | 1.306415396 |
40000000 | 5000*4000*2 | 100 | 96139 | 1 | 0 | 127592 | 1 | 0 | 0.753487679 | 1.327161714 |
比如第一組網絡結構3*100*2共600個節點,迭代次數100次,java用時47ms,cuda用時657ms,
java第100次y[0]= 0.9999999960729808 ;y[1]=0
Cuda第100次y[0]= 0.9999999960729809 ;y[1]=0
最後一位小數不一致時因爲四捨五入規則造成的。
當節點數量超過240萬以後經過100次迭代輸出已經都是1和0,已經沒有區分度只是用來測量速度。
從表格看出來當節點數量只有600個時候java的速度甚至是cuda的13.9倍,很意外的是即便節點數量有4000萬個java的速度依然是cuda 的1.32倍。