CUDAを使えばどのくらい高速化できるのか、実際にフィルター処理をCUDA化して処理時間を比較してみました。 CUDAの使用を検討されている方の参考になれば幸いです。
CUDAとは
CUDA(Compute Unified Device Architecture:クーダ) とは、
NVIDIA GPUを利用して並列計算を行うためのソフトウェア開発・実行環境の一つです。
専用のプログラミング言語やコンパイラ、ライブラリ、API(Application Programming Interface)などで構成されます。 Windows環境の場合は、Visual StudioとCUDA Toolkitをインストールすれば、 比較的簡単に開発環境を作成することができます。
CUDAの得意な処理、不得意な処理
GPUは、画像処理に特化したデバイスであるため、画像を入力として左上から右下まで
一画素ずつ走査し処理するような繰り返し処理にとても強いです。
一方で、1つの命令で複数のデータを処理するSIMD (Single Instruction Multiple Data) 形式で
並列実行を行うため、プログラム中に分岐処理を含む場合は性能を極端に落とすことがあります。
下記の図のような場合、CPUの各コアは分岐の条件を元に命令Aまたは命令Bのどちらかを それぞれ実行します。しかし、GPUの場合、複数のコアがグループとなっており、 グループに対して1つの命令しか実行することができないため、命令Aと命令Bを同時に 実行することができません。
そのため、このような分岐処理が含まれていると、命令Aの実行が終わってから命令Bを 実行する必要があるため、全体の実行時間が増加してしまうことがあります。

ノイズ除去フィルターをCUDA化してみる
実際にノイズ除去フィルターをCUDAを使って高速化してみました。 フィルター処理は処理A~Gのように複数の計算に分割します。 それぞれの処理に対してCPUで実行した場合とGPUで実行した場合の処理時間を計測しています。 横方向は画像に対してX軸方向に計算していく処理、縦方向は画像に対してY軸方向に計算していく処理になります。
結果を見ていくと、処理C・D以外はCUDAを使用することで高速化することができました。 分岐処理が含まれている処理F・Gも今回のケースでは処理時間を短縮することができました。
一方で、処理C・Dがなぜ高速化できていないかというと、ブロックサイズ・グリッドサイズの大きさが原因です。
高速化できた処理は1ピクセルの処理を1スレッドで行っているのに対して、
処理C・Dはフィルター後の値を計算に使用できるように、1行分の処理を1スレッドで行っています。
そのため、ブロックサイズ、グリッドサイズが小さくなり、ハードウェアリソースを効果的に使用することができず、
CPUと比較しても大きな効果が得られなかったと考えられます。

そこで、処理C・Dに対してメモリの最適化を行いました。
GPUで使用できるメモリにはいくつか種類がありますが、当初は一番オーソドックスと思われるグローバルメモリを使用していました。
しかし、グローバルメモリは、デバイス上の全てのスレッドから参照できますが、最も遅延が大きいメモリです。
そのため、シェアードメモリと呼ばれる、高速ですが同一ブロック内のスレッドでしか読み書きできないメモリを使用するように変更しました。
結果、画像一行分のデータを一旦シェアードメモリに格納してからフィルター処理を実行することで、大きく高速化することができました。
まとめ
CUDAを使った計算処理の高速化について、実際に使用した際の結果をまとめてみました。 今回の実験では、CUDAを使用することで多くの処理において大幅な高速化が実現できました。 特に、CUDAが得意な処理である処理A・Bでは、CPUと比較して大きな速度向上が見られました。
一方で、処理C・Dのように、ブロックサイズやグリッドサイズの設定が適切でない場合や、 GPUが不得意な計算をする場合には、CUDAの効果が十分に発揮されないことも確認できました。 これらの処理では、パフォーマンスの最適化が必要です。
パフォーマンスの最適化は、NVIDIAのプロファイラー(Nsight Compute, Nsight Systems)を使用して、 効果的にメモリを使用できているか、どの処理にどのくらいかかっているのか確認していくと、効率的に進めることができます。
総じて、CUDAを活用することで、画像処理の分野において大きなパフォーマンス向上が期待できることが分かりました。
最後に
私たちのサービスでは、データ分析基盤の構築やDeep Learningモデル開発、
MLOps構築、生成AIモデル開発等データに関わるプロジェクトを伴走支援しております。
データ分析基盤開発やデータのAI活用経験のある方や、興味のある方は、ぜひご応募ください。 あなたのスキルと情熱をお待ちしています。

