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



CAPS-Entreprise社は、
フランス レンヌ市に本社がありGPUコンピューティングに特化した開発ツールを自社開発販売している革新的なソフトメーカです. 2002年にINRIA(フランス国立情報学自動制御研究所)、レンヌ大学等7名の研究者でコンパイラーの開発を目的にプロジェクトチームが発足し、ベンチャーキャピタルの出資を受け株式会社となりその後GPUコンピューティングのエポックメーキング的な時流に乗り目下GPU開発ツール
HMPP(Hybrid Multicore Parallel Programming workbench)を欧州、米国、アジアで拡販中です.


・CPU用コンパイラ(GNU、インテル等のC/C++ 、fortran)、Sun Studio, Open64 及びPGI10.0
・GPU ターゲットコンパイラ(CUDA等) および CAPS-Entreprise社HMPP
これ等がインスールされた環境で、ソースファイルのGPU処理を行わせたい部分(ループ領域)に指示行(ディレクティブ)を挿入します. この指示行内に該当GPU(CUDA等)、コンパイラ(インテル等)と諸オプションを明示します. この後HMPPのコマンド実行で自動的にCPU部とGPU部の実行オブジェクトが一つにまとめられ生成されます(ファイル名はa.out等自由). 同時生成されるxxx.cuファイル(CUDAの場合)は手動で修正チューニングが可能です. 
・指示行(ディレクティブ)はOpenMPのプラグマ(#pragma omp parallel for)同様ですのでCPUコンパイラ実行時には無視されますので、ソース互換が保たれます.


1 ....
2 #pragma hmpp testlabel codelet, target=CUDA, args[vout].io=inout
3 static void the_kernel(unsigned int N, unsigned int M,
4               float vout[N][M], float vin[N][M]){
5   int i, j;
6   for(i = 2; i < (N-2); i++) {
7     for(j = 2; j < (M-2); j++) {
8       float temp;
9       temp = vin[i][j]
10         + 0.3f *(vin[i-1][j-1] + vin[i+1][j+1])
11         - 0.506f *(vin[i-2][j-2] + vin[i+2][j+2]);
12       vout[i][j] = temp * (vout[i][j]);
13     }                    
14    }   (上下オレンジ色のディレクティブ間で、関数がGPU計算すべくループ化されます)
15  }
16  int main(int argc, char **argv){
17   unsigned int n = 100;
18    unsigned int m = 20;
19    int i, j;
20    float resultat = 0.0f;
21    float out[n][m];
22    float in[n][m];
23    …
24   // init
25    for(i = 0 ; i < n ; i++){
26     for(j = 0 ; j < m ; j++){
27      in[i][j] = (COEFF) * (-1.0f);
28     out[i][j] = (COEFF) + (j * 0.01f) ;
29    }
30  }
31 #pragma hmpp testlabel callsite
32   the_kernel(n,m,out,in);
33    ....
34   printf("result : %f\n",resultat);
35 }




・ “codelet” & “callsite” : 2つをそれぞれ挿入するのみ

#pragma hmpp sgemm codelet, target=OPENCL , ...

extern void sgemm( int m, int n, int k,floatalpha,
             const float vin1[n][n], const float vin2[n][n],
             float beta, float vout[n][n] );

int main(int argc, char **argv) {
...
 for( j = 0 ; j < 2 ; j++ ) {
    #pragma hmpp sgemm callsite
    sgemm( size, size, size, alpha, vin1, vin2, beta, vout );
 }

Fortranにおいても同様の構成にて実現



・Runtimeの利用により柔軟な構成が可能
   *実行時に環境を識別
   *マルチGPUにも簡単に移行可能
   *リソースの管理によって効率的な実行
・HMPP Workbenchが各ターゲット向けコードを生成
・全てのソースが修正,再構成可能
 
CPU用ソースファイル
CPU用バイナリ
 
GPU用ソースファイル
GPU用バイナリ
   (C)Copyright JCC-Gimmik Ltd. 2009 All rights reserved.