Cell/B.E.プロセッサでの OpenMP の使い方
Cell/B.E.プロセッサの c++ で openmpを利用するサンプルプログラムとコンパイル方法と実行結果.
使用した機材は,IBM 社の CELL/B.E. で, コンパイラは IBM 社の XLC
ソースコードtest.cpp
---------------------------------------------------------------------------- #include#include #include int main(int argc, char *argv[]) { printf("start\n"); omp_set_num_threads(omp_get_num_procs()); //forループのスレッド数設定 printf("thread%d\n", omp_get_num_threads()); //現在のスレッド数 printf("cpu%d\n", omp_get_num_procs()); //利用可能なcpu数 #pragma omp parallel for //for文を並列に行うopenmpの記述 for(int i=0;i<100;i++){ printf("%d %d %d %d\n",i,omp_get_num_procs(), omp_get_num_threads( ),omp_get_thread_num()+1); } printf("end\n"); return 0; } ----------------------------------------------------------------------------
コンパイル方法(3通り)
- ppuだけで実行する場合
ppuxlc++ test.cpp
- spuだけで実行する場合
spuxlc++ test.cpp
- ppu+spuで実行する場合
cbexlc++ test.cpp
実行結果の例
以下に「ppu+spu」の場合の実行結果の例を載せる. ppuだけとspuだけの場合は利用可能cpuが「1」となり、forループ中の表示は「i 1 1 1」となる.
---------------------------------------------------------------------------- start thread1 cpu16 93 16 16 1 18 16 16 13 94 16 16 1 19 16 16 13 20 16 16 13 86 16 16 2 54 16 16 7 87 16 16 2 21 16 16 13 88 16 16 2 42 16 16 9 89 16 16 2 43 16 16 9 90 16 16 2 44 16 16 9 91 16 16 2 45 16 16 9 92 16 16 2 46 16 16 9 60 16 16 6 48 16 16 8 12 16 16 14 22 16 16 13 36 16 16 10 55 16 16 7 49 16 16 8 56 16 16 7 50 16 16 8 47 16 16 9 66 16 16 5 13 16 16 14 72 16 16 4 14 16 16 14 73 16 16 4 15 16 16 14 74 16 16 4 16 16 16 14 23 16 16 13 17 16 16 14 79 16 16 3 95 16 16 1 80 16 16 3 37 16 16 10 24 16 16 12 0 16 16 16 51 16 16 8 67 16 16 5 52 16 16 8 75 16 16 4 76 16 16 4 1 16 16 16 96 16 16 1 6 16 16 15 97 16 16 1 7 16 16 15 8 16 16 15 9 16 16 15 10 16 16 15 11 16 16 15 57 16 16 7 38 16 16 10 25 16 16 12 39 16 16 10 30 16 16 11 40 16 16 10 31 16 16 11 32 16 16 11 33 16 16 11 34 16 16 11 35 16 16 11 98 16 16 1 58 16 16 7 81 16 16 3 59 16 16 7 26 16 16 12 27 16 16 12 28 16 16 12 29 16 16 12 53 16 16 8 77 16 16 4 61 16 16 6 62 16 16 6 63 16 16 6 64 16 16 6 65 16 16 6 68 16 16 5 82 16 16 3 78 16 16 4 83 16 16 3 69 16 16 5 70 16 16 5 71 16 16 5 99 16 16 1 84 16 16 3 85 16 16 3 41 16 16 10 2 16 16 16 3 16 16 16 4 16 16 16 5 16 16 16 end ----------------------------------------------------------------------------