簡體   English   中英

ArrayFire CUDA應用程序在開始的第一分鍾非常慢

[英]ArrayFire CUDA application is extremely slow in the first minute

我正在使用在Windows 10 + Nvidia Gtx 970上運行的ArrayFire編寫測試程序。該程序是使用SGD求解器訓練神經網絡。 因此,主要的計算是更新網絡參數的迭代。 迭代在一個名為step()的函數中。

該程序會執行預期的操作,只是在第一分鍾內執行速度非常慢。 以下是程序的輸出。 第一列是經過的時間。

ArrayFire v3.5.1 (CUDA, 64-bit Windows, build 0a675e8)
Platform: CUDA Toolkit 8, Driver: CUDA Driver Version: 8000
[0] GeForce GTX 970, 4096 MB, CUDA Compute 5.2
  time epochs training error
     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。 但是一分鍾后,它突然加速完成了大約4秒鍾的一個紀元。

分析數據還說明了同樣的事情:在第一分鍾內,函數step()的平均執行時間約為500毫秒,但在第一分鍾后,該平均時間降至6毫秒。

Nvidia視覺分析器顯示,內核在第一分鍾幾乎一直處於空閑狀態。

我不知道在第一分鍾之前或之后會導致性能變化的原因。 任何幫助表示贊賞。

ArrayFire在運行時使用JIT編譯將多個對函數的調用融合在一起。 因此,當您執行加法或任何其他按元素的操作時,ArrayFire將創建一個自定義內核並執行此內核。 首次生成此內核時,這會產生一些開銷,但這些內核已緩存,不需要編譯其他調用。 通常,在不需要其他編譯之前,只需要進行幾次迭代即可。 奇怪的是,即使經過60次左右的迭代,內核仍然很慢。

使用基於內核內存和大小的內部啟發法來評估JIT內核。 也許您的應用程序沒有以最佳方式觸發內核並導致其他內核編譯。 您可以通過在變量上調用eval函數來強制求值,從而解決此問題。 這是一個人為的示例:

array a = randu(10, 10);
array b = randu(10, 10);
for(int i = 0; i < 100; i++) {
      a += b / 4;
      b *= i;
      eval(a, b);
}

在這里,您將在每次迭代中評估變量a和b的JIT樹。 這將在每次迭代中重用同一內核,而不是為不同的多次迭代創建內核。

需要注意的一件事是,按元素的方式以及某些條件功能(如選擇和移位)是JIT的。 其他功能在使用前強制對其參數進行評估。 同樣,如果您評估得太頻繁,則會降低應用程序的性能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM