cudaGetDevicePropertiesとcudaDeviceGetAttribute

目次

CUDA Advent Calendar 2019 9日目の記事です.

CUDAのデバイスのステータスの取得

Cooperative Groupsで全スレッド同期が可能なスレッド数の計算やランタイムでのCompute Capabilityの取得などGPU固有の情報を取得することは多々あると思います.
CUDAではデバイスの情報を取得する関数としてcudaGetDevicePropertiesとcudaDeviceGetAttributeが用意されています.
それぞれの関数の違いとしては,cudaGetDevicePropertiesがデバイスの情報すべてを構造体に詰めて返してくれるのに対し,cudaDeviceGetAttributeは欲しい情報をピンポイントで取りに行くところが挙げられます.
(一方の関数でしかとれない情報もあります)
で,NVIDIA Developer Blogにこんなエントリーがありました. 要約すると,cudaGetDevicePropertiesで取得される一部の情報は取得に時間がかかるので,この情報が必要ない場合はcudaDeviceGetAttributeでピンポイントで取得したほうがいいよというもの.
遅いものというのはcudaDevAttrClockRate, cudaDevAttrKernelExecTimeout, cudaDevAttrMemoryClockRate, cudaDevAttrSingleToDoublePrecisionPerfRatioだそうです.
ではこれらの情報の取得だけが極端に遅いだけなのかを調べてみましたというのがこの記事です.

時間のかかるAttribute Top 10

こんなプログラムで一気に取得にかかった時間を取得します. 取得したAttributeはenum cudaDeviceAttrのもの全てで,廃止されたものや予約されているが空のものも含めて全てです.

$ ./get_attr_time | sort -k 3 -n -r | head -n 10
                        cudaDevAttrMemoryClockRate :  144088.634 [ns]
                              cudaDevAttrClockRate :  143006.136 [ns]
                     cudaDevAttrMaxThreadsPerBlock :  56730.388 [ns]
                      cudaDevAttrKernelExecTimeout :  28354.916 [ns]
              cudaDevAttrHostNativeAtomicSupported :  48.030 [ns]
           cudaDevAttrCooperativeMultiDeviceLaunch :  24.925 [ns]
                      cudaDevAttrCooperativeLaunch :  24.812 [ns]
             cudaDevAttrComputePreemptionSupported :  21.849 [ns]
              cudaDevAttrMaxSurface2DLayeredHeight :  21.642 [ns]
                   cudaDevAttrMaxRegistersPerBlock :  20.199 [ns]
やはり挙げられていた4つが極端に遅いようです.
ただ,上位9つは何度プログラムを実行しても入れ替わらず,それ以降は結果が変わります.
やはり極端に遅いわけではないが遅めのものもあるようです.
予約されているだけで使われていなさそうなcudaDevAttrReserved92/3/4は17[ns]くらいなので,20[ns]程度の時間がかかっているAttributeの順番は意味がなさそうです.
カテゴリー:CUDA
記事作成日:2019-12-09