GPUプログラミングにおいて気をつけることは何点かあるが,まずは以下の点がCPUでのプログラミングと大きく異なるので重要だ.逆に,以下の点を抑えればGPUで動くプログラムが一応書ける.
(1) GPUで計算対象の変数はGPUボード上のビデオメモリに置かれなければならない
 ここで言うビデオメモリとは,VRAM,CUDAではGlobal memoryと呼ばれるのもののこと.メインメモリ-GPU間はPCI-Expressで接続されており,メインメモリ-CPU間の通信よりも格段に遅い.そのため,計算前に計算対象の変数をメインメモリからビデオメモリへ転送し,計算後には逆にビデオメモリからメインメモリに転送することでこの問題を克服している.最近はメインメモリへ直接通信を行える機能もあるが基本的にはこうした方が良い.ビデオメモリ上の変数を見る際も,基本的にはメインメモリに転送してから見る必要がある.
(2) GPU上では複数コアが同時に動作する並列計算が基本
GPUはCPUでいうところのコア数が数十あり,最初から複数スレッドを立てた並列プログラミングを前提としてプログラミング言語が設計されている.具体的にはpthreadのように,各スレッドが独立に実行する関数を用意する必要がある.これの関数はCUDAではカーネルと呼ばれる.実際には1000を超えるスレッドが論理的に時間を共有しており,このことは従来のOpenMPを用いたCPU上での共有メモリ型並列プログラミングよりも遥かに多い並列数を必要とすることを意味する.
|