見出し画像

[技]GPU と CPU プログラミングを15分で

こんにちは、マット@ https://standbyme.online です。今回は質問が多いGPUとCPUのプログラミングの違いと性能をさくっと15分で紹介!

画像19

対象:C言語,CUDA,GPGPU初心者 グラフィックスボードに興味あり

必要機材:NVIDIA グラフィックスボード

まずはじめにCPUとGPUの違いとは?簡単にはこんな感じです。

画像1

Graphics Processing Unit(グラフィックス プロセッシング ユニット)
コンピュータシステムにおいて、画像表示を担当するASICであるグラフィックコントローラが発展したもので、ジオメトリエンジンなどの専用ハードウェアによって画像処理を行う集積回路を指す。
身近なところでは、PCに接続されるグラフィックカードGeforce/RadeonがGPUと呼ばれる。
CUDA:NVIDIAが提唱する、GPGPU向けのC言語。ほぼC言語と一緒。拡張子*.cu。
ジオメトリエンジン(Geometric Engine): 物体を3D CGで表現する際、頂点座標などのデータを下にPC内仮想3次元空間へ作成します。作成後、モニタへ描画する際、3次元から2次元へ座標変換するこの処理(3次元から2次元への変換)はジオメトリ処理と呼ばれ、膨大な浮動小数点演算が必要。GPUのグラフィックス処理能力は半導体技術の進歩と共に向上し、現在では、毎秒500億テクセル以上の処理能力。
テクセル: 3次元グラフィックスで、物体の表面の質感を表現するためのテクスチャを構成するひとつの点。 2次元グラフィックスにおけるピクセルの3次元版
FLOPS: コンピュータの処理速度を表す単位。一秒間に浮動少数演算が行える回数。
シェーダ:GPU内に複数個搭載されている小型マルチプロセッサ
(ピクセルシェーダ・頂点シェーダ等)
統合シェーダ(ストリームプロセッサ): 従来のシェーダは機能別に分かれていましたが、CUDA対応GPUとなり、機能別シェーダを廃止し、全てのシェーダが同一の機能を持つシェーダとなった。

ここで嫌にならないでくださいね....

C言語とCUDA言語の違い

GPGPUの代表格、CUDAプログラミングをC言語との違いで見てみよう。ほぼ一緒。怖くない。

void hello_c(){
   printf("Hello World! from C言語\n");
}
int main() {
   hello_c();
   return 0;
}
__global__ void hello_cuda(){
   printf("Hello World from CUDA言語!\n");
}
int main() {
   hello_cuda<<<1,1>>>(); 
   return 0;
}

「__global__」はGPU呼び出し。「<<<...>>>」は魔法の記号だよ。大した話ではないので、暗記の必要は無いよ。

GPUとCPUプログラミングの違い

早速GPU性能を見て行くよ。プログラミングの違いやGPUの処理フローをみて理解しよう、さっくり。GPU処理はホスト(パソコン)側のCPUが必ず必要になります。下図ではCPUからGPUへ演算を行う処理フローを示すよ。

画像2

では早速性能を計りましょう。

画像3


画像4

以下の結果では、GPUが圧倒的な速度だね。

画像5

画像8

メモリコピー

メモリコピーはいつの時代も嫌われ者。皆さんも日常的にカット&ペーストしていますね?それといっしょでパソコンのプログラムもこの繰り返しだよ。科学計算などの世界や三次元ゲームの世界だと代の嫌われ者。だってコピーばかりで、実際の計算時間が待たされるから。なのでGPUプログラミングでも同様に、可能な限りグラフィックスカードなどへのアクセスは減らすのが勘所。

画像9


ワープ!

画像18

CUDAプログラミングでスレッドとは、ワープ単位である32スレッドが同一命令を実行するよ。だからディープラーニングやニューラルネットワークで重み行列演算(掛け算と足し算の繰り返し)などの並列処理が速いんだね。

その時に「if」ワープダイバージェンスが起こると、プログラミングのいわゆる「if分岐」が起こるよ。分岐って名前の通り立ち止まり考えて、それぞれA/BとX/Yで違う処理が行われるね。そして最後に「z」また再会。この処理は並列処理では常にボトルネックになるね。CUDAプログラミングでは気を付けよう。

画像10

画像11

画像12

パフォーマンスをチューニングしよう

画像13

画像14

画像15

CUDライブラリ

GPGPUの代表格CUDAには、いろいろなライブラリ(便利な機能)があるよ。もちろんPython向けライブラリもあるよ。

画像16

まとめ

画像17


では今日はこれで!

Have a nice day! by マット
standbyme.online Twitter Facebook LinkedIn Instagram 


#GPGPU #CUDA #Python #CPU #プログラミング初心者 #プログラミング

もし記事を気に入っていただけましたら、サポートをおねがいします!