分别用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倍。