フランスCAPS社のGPUコードジェネレーター(コンパイラ)の販売と導入コンサルティングを主に行っております。



1次元配列の和を計算する簡単なプログラムをGPUで計算させる場合、CUDAとHMPPでどのようにプログラミングする必要があるかを、下に示したソースコードで比較してみます。

CUDAの場合、メモリ割り当て/解放、データ転送などを行うためにCUDA関数をCPU側に追加し、GPUで実行されるカーネル中の配列インデックスを、GPUのスレッド番号に対応するように書き換える必要があります。

HMPPでは関数を定義する部分と関数コールの前にディレクティブを追加するだけで、この関数に関するメモリ割り当て/解放、データ転送、ループに関するグリッド化まで自動的に行われます。他のディレクティブを使うことで、メモリ割り当てやデータ転送などを任意のタイミングで行うことも可能です。
特筆すべき点として、アプリケーションはCPUコードを保持しているため、HMPPでのコンパイルをしなければディレクティブが無視されて、従来通りのCPUアプリケーションとして実行が可能です。
Fortranに関しても、Cと同様にプログラム中にディレクティブを挿入することで、コードレットのGPU実行を行うことができます。

1次元配列の和をGPUで計算 (CUDA vs HMPP)

CUDA

1次元配列の和を計算CPUコードをCUDA化するために、追加・修正したコードの一部を抜粋して以下に示します。

__global__ void cu_kernel(int n, float* a_gpu, float* b_gpu, float* res_gpu){

 int i;
 i = blockIdx.x*blockDim.x + threadIdx.x ; // GPUスレッドのインデックス
 res_gpu[i] = a_gpu[i] + b_gpu[i];

}

int main(){
 dim3 thread(num_th_x);  dim3 block(n/num_th_x);  
 cudaMalloc((void**)&a_gpu,sizeof(float)*n);
 cudaMemcpy(a_gpu, a, sizeof(float)*n, cudaMemcpyHostToDevice); 
 cu_kernel<<<block, thread>>> (n, a_gpu, b_gpu, res_gpu); 
 cudaMemcpy(res, res_gpu, sizeof(float)*n, cudaMemcpyDeviceToHost); 
 cudaFree(res_gpu); 

}



HMPP
HMPPでは元のCPUコードの2箇所にディレクティブを追加するだけで自動的にループをグリッド化してGPUで計算することができます。

#pragma hmpp k1 codelet, target=CUDA &
#pragma hmpp k1 args[res].io=out

void kernel(int n, float a[n], float b[n], float res[n]){
 int i;
 for(i=0;i<n;i++){
  res[i] = a[i] + b[i];
 }
}

int main(){
 ・・・
// codeletの呼び出し。GPUメモリ割り当て/解放、データ転送、kernel実行が行われる
 #pragma hmpp k1 callsite
 kernel(n, a, b, res);
 ・・・
}

----------------------------------------------------------------------------------
HMPPではCPUコードの2箇所にディレクティブを追加し、他に変更を行う必要がありません。codeletで指定された関数内のループは自動的にグリッド化されます。メモリ確保やデータ転送はHMPPにより自動的に行われますが、ディレクティブによってユーザーがコントロールすることも可能です。ここでは、2箇所にディレクティブを追加するだけでCPUコードを保持してGPUで計算を行うことができており、CUDAに比べて非常に簡単です。
OpenMPの様な”#ディレクティブ”はCPUコンパイラ―では無視され、ソース保全されます。


CUDAではCPUコードにcudaMallocやcudaMemcpyなどの関数を追加してメモリ確保やデータ転送を行い、カーネルの計算では、ループをGPUのスレッドに割り当てた形に書き換えてコードを作成する必要があります。

----------------------------------------------------------------------------------




   (C)Copyright JCC-Gimmick Ltd. 2009 All rights reserved.