【发布时间】:2018-05-09 07:18:35
【问题描述】:
我正在编写一个使用 ArrayFire 在 windows 10 + Nvidia Gtx 970 上运行的测试程序。该程序是用 SGD 求解器训练一个神经网络。因此,主要计算是更新网络参数的迭代。迭代在一个名为 step() 的函数中。
该程序执行预期的操作,只是它在第一分钟执行得非常慢。以下是程序的输出。第一列是经过的时间。
ArrayFire v3.5.1 (CUDA, 64-bit Windows, build 0a675e8) 平台:CUDA Toolkit 8,驱动程序:CUDA 驱动程序版本:8000 [0] GeForce GTX 970、4096 MB、CUDA 计算 5.2 时间训练误差 5 0.002 5.6124567 6 0.007 5.5981609 7 0.010 5.3560046 8 0.015 5.2485286 9 0.020 5.1370633 10 0.022 5.1081303 …… 52 0.148 3.2528560 53 0.150 3.2425120 54 0.153 3.2180901 55 0.155 3.2048657 56 0.157 3.1949191 57 0.158 3.1816899 58 0.160 3.1717312 59 0.162 3.1597322 60 0.165 3.1370639 60 0.498 2.1359600 61 0.548 2.0685355 61 0.882 1.7098215 62 0.943 1.6575973 62 1.277 1.4156345 63 1.343 1.3845720 63 1.677 1.1789854 64 1.733 1.1549067 64 2.067 1.0162785 …… 71 4.517 0.4732214 71 4.850 0.4522045 72 4.910 0.4501807 72 5.243 0.4355422 73 5.305 0.4307187如您所见,在第一分钟,它甚至没有完成 1/5 个 epoch。但一分钟后,它突然加速,大约4秒完成一个纪元。
分析数据也说明了同样的事情:在第一分钟,函数 step() 的平均执行时间约为 500 毫秒,但在第一分钟之后,它下降到 6 毫秒。
Nvidia 视觉分析器显示内核在第一分钟几乎一直处于空闲状态。
我不知道什么会导致第一分钟之前|之后的性能变化。任何帮助表示赞赏。
【问题讨论】: