CUDAプログラミング入門 計算の無駄を省く


並列分割の鍵 グリッドとブロックの設定

条件分岐によるスレッド制御

図1 画像の幅や高さがブロックのサイズで割り切れない場合,余分なスレッドが生まれる.解決の鍵は,計算処理を並列に分割するときのグリッドとブロックの設定.画像クリックで動画を見る.または記事を読む.[提供・著]松原 論司.
詳細[VOD/KIT/data]Jetson Nanoキットで学ぶ NVIDIA CUDAプログラミング入門

CUDA(Compute Unified Device Architecture)はNVIDIAが提供するGPU向けの並列計算プラットフォームであり,大規模な計算処理を効率的に行うための強力なツールです.

計算効率アップの鍵はグリッドとブロックの設定

CUDAプログラミングでは,計算処理を並列に分割して処理するために「グリッド」と「ブロック」を設定します.たとえば,画像処理の際に,画像の幅($W$)や高さ($H$)を,各ブロックのサイズで割り切れない場合,余分なスレッドが生まれ,計算リソースが無駄になります.

画像の幅が1024ピクセルでブロック・サイズが32ピクセルの場合,32の倍数で割り切れるため,すべてのスレッドが有効に使われます.しかし,幅が1000ピクセルの場合,31ブロック分のスレッドだけでは足りず,32ブロックに設定すると余剰スレッドが発生します.このような場合,余ったスレッドは処理に必要なピクセル範囲を超えるため,実質的に計算の無駄が生じます.

無駄を省く工夫: 条件分岐によるスレッド制御

計算の無駄を省くためには,スレッドの条件分岐を導入することで,無駄な計算をスキップすることが有効です.

先ほどの例では,幅が1000ピクセルの画像処理時に,$x$と$y$のインデックスが画像の幅や高さを超えた場合,そのスレッドでの処理を行わないように制御を加えます.CUDAでは次のようにして条件を設定できます.たとえば,次のような方法で,$x$座標が幅$W$以上であれば,そのスレッドでは処理を行わないように設定することで,不要な計算が発生しないようにします.

これにより,計算結果が必ずしもブロックの倍数と一致しない場合でも,無駄なスレッドを追加することなく必要なスレッド数を正確に割り出すことができます.

グリッド,ブロック,スレッド

CUDAの主要概念として,グリッド,ブロック,スレッドの3つがあり,それぞれが計算の効率に影響を与えます.それぞれの役割について詳しく説明します.

  1. グリッド(Grid)
  2. すべてのブロックの集合であり,並列に計算する領域を管理します.処理対象のデータ全体をカバーするために設定されるため,グリッドのサイズ設定は計算効率に直結します.
  3. ブロック(Block)
  4. グリッド内の各小さな計算単位で,1つのブロックには複数のスレッドが含まれます.ブロックはほかのブロックと独立して計算を行い,同期処理やメモリ共有が可能なため,効率的な計算に必要不可欠です.
  5. スレッド(Thread)
  6. 実際の計算を行う最小単位であり,計算処理を行う個々のタスクです.各スレッドには,$x$, $y$, $z$の座標が割り当てられ,それに基づいて処理を行います.
〈著:ZEPマガジン〉

動画を見る,または記事を読む

著者紹介

  • 光学・医療機器メーカなどで約30年間,電子顕微鏡の鏡筒を制御するプログラムなどの開発に従事

著書

  1. [VOD/KIT/data]Jetson Nanoキットで学ぶ NVIDIA CUDAプログラミング入門,ZEPエンジニアリング株式会社.

参考文献

  1. [VOD/PiZero KIT]Python×ラズパイで初めての量子コンピュータ,ZEPエンジニアリング株式会社.
  2. [VOD/KIT]ラズベリー・パイで学ぶエッジAIプログラミング入門,ZEPエンジニアリング株式会社.
  3. [VOD/KIT]人工知能カメラM5StickVで作って学ぶ画像解析AI開発入門,ZEPエンジニアリング株式会社.