Microsoft PowerPoint - 先端GPGPUシミュレーション工学特論(web).pptx

Size: px
Start display at page:

Download "Microsoft PowerPoint - 先端GPGPUシミュレーション工学特論(web).pptx"

Transcription

1 複数 GPU の利用 長岡技術科学大学電気電子情報工学専攻出川智啓

2 今回の内容 並列アーキテクチャと並列処理の分類 OpenMP 複数 GPU の利用 GPU Direct によるデータ通信 939

3 複数の GPU を利用する目的 Grouse の 1 ノードには 4 台の GPU を搭載 Tesla M2050 1T FLOPS/ 台 3 GB/ 台 4 台全てを使う事で期待できる性能 GPU を 1 台だけ使った時の 4 倍高速化 GPU1 台では収まらないサイズの問題を計算 940

4 複数の GPU を利用する目的 4 台全てを使う事で期待できる性能 GPU を 1 台だけ使った時の 4 倍高速化 高速化は達成可能 複数の GPU を使うための手続きやデータの移動が必要 GPU 間のデータ交換が必要になると速度が低下 GPU1 台では収まらないサイズの問題を計算 利用できるメモリ容量は GPU の台数に比例 1 台では実行できない大規模な問題も実行可能 941

5 複数の GPU が利用できる環境 1 台の計算機に複数の GPU が搭載 複数の GPU を搭載するために大きな筐体が必要 1 台の PC で完結するので, プログラム中でネットワーク通信を行う必要がない 帯域の狭い PCI Ex バスを複数の GPU で取り合うため, データ移動の効率は悪い PCI Ex バス 942

6 複数の GPU が利用できる環境 1 台の GPU が搭載された計算機をネットワークで接続 小さい筐体のPC( キューブ型 PCなど ) を並べて作成 各 PCにCPUやメモリが必要 複数 GPUの利用にはネットワーク通信が必須 PCI Ex PCI Ex PCI Ex PCI Ex 高速ネットワーク,LAN 943

7 複数の GPU が利用できる環境 複数の GPU が搭載された複数の計算機をネットワークで接続 スーパーコンピュータ等の大規模計算環境 性能の大半は GPU が占める 2~4CPUs 2~4GPUs 2~4CPUs 2~4GPUs 2~4CPUs 2~4GPUs 944 高速ネットワーク

8 複数の GPU が利用できる環境 CUDA における複数 GPU 利用 新しいバージョン GPU 間通信を行う命令が用意されたり, 複数の GPU を利用する数値計算ライブラリが登場 ( 古いバージョンと比べれば ) 利用しやすくなっている 古いバージョン 複数の GPU を利用するための機能は未搭載 従来から並列計算に利用されていたライブラリと併用 OpenMP や MPI など 945

9 複数 GPU の利用 (CUDA 3.2 以前 ) CUDA の制約 1 スレッドは複数の GPU を利用できない GPU は必ず CPU の 1 スレッド ( もしくは 1 プロセス ) に割当て 4 台の GPU を利用するためには 4 スレッド (4 プロセス ) 必要 OpenMP や MPI を利用 並列計算を行うプログラムを作成 スレッドやプロセス番号を基に利用する GPU を決定, 処理を実行 従来の並列計算の素直な拡張 946

10 複数 GPU の利用 (CUDA 4.0 以降 ) CUDA の制約の緩和 1 スレッドから複数の GPU を利用 ( 切替 ) 可能 2 台の GPU 間でデータ通信を行う命令の追加 GPU Direct v2.0 peer to peer 複数 GPU 間で統一されたメモリ空間を利用可能 Unified Virtual Addressing 947

11 複数 GPU の利用 (CUDA 4.0 以降 ) 複数 GPU を利用するプログラムの作成が容易 cudasetdevice() でカレントデバイスを指定 CUDA の命令はそのカレントデバイスに対して発行 別のデバイスを利用する際は cudasetdevice() でカレントデバイスを切替 複数の GPU へのデータコピー, 複数の GPU でカーネルの起動が容易 948

12 複数 GPU 化の例題 ベクトル和 1.OpenMP を利用する方法 従来の並列計算の拡張 2.CUDA4.0 の機能を利用する方法 949

13 並列アーキテクチャの分類 システムの特徴付け, プロセッサの分類 Flynn の分類 並列アーキテクチャのグループ分け データの処理と命令の並列性に着目 SISD 単一命令単一データ SIMD 単一命令複数データ MISD 複数命令単一データ MIMD 複数命令複数データ 950

14 Single Instruction Multiple Data streams 単一命令複数データ 複数のまとまったデータに対して同じ演算を同時に実行 命令は一つ, その命令が同時に多くのデータに対して適用されるアーキテクチャ 数値シミュレーションに最適 数学のベクトルや配列計算の概念に一致 ベクトルプロセッサとも呼ばれる GPU もここに分類 データ 命令 A 0 B 0 A 1 B 1 + A 2 B 2 A 3 B 3 951

15 プロセス OS から資源 ( コア, メモリ, 外部記憶など ) を割り当てられ, 実行状態 ( または待機状態 ) にあるプログラム システムプロセス OS の実行に関係するプログラム ユーザプロセス ユーザ権限で実行されているプログラム 952

16 マルチプロセス 複数のプロセスが存在し, 並列に実行 プロセスが一つのみ プロセスが二つ以上 シングルプロセスマルチプロセス マルチプロセスに対応した OS が必要 現在の OS はマルチプロセスに対応 シングルコア CPU 一つでもマルチプロセスが可能 OS が複数のプロセスを切替 複数のプロセスが並列に実行されているように見せる 953

17 マルチプロセス 各プロセスに専用のメモリ領域を割り当て CPUやメモリは複数のプログラムに割り当てられる プログラムはCPUやメモリを独占しているように振る舞う プロセス A スレッド CPU メモリ OS メモリ プロセス B スレッド メモリ 954

18 スレッド プログラムの処理の最小実行単位 プロセス内で複数のスレッドが存在 1プロセスに一つのスレッドのみ 1プロセスに二つ以上のスレッド シングルプロセス シングルスレッドマルチスレッド シングルスレッド マルチスレッド マルチプロセス シングルスレッド マルチスレッド 955

19 マルチスレッド 一つのプロセスに二つ以上のスレッドが存在 一つのプロセスに専用のメモリ領域を割当 プロセス内の複数のスレッドはメモリ領域を共有 プロセス A スレッド スレッド CPU メモリ OS メモリプロセスB スレッドスレッド メモリ 956

20 並列計算機システム 並列処理の基本 処理を何らかの方法で分割 分割した処理をプロセッサ ( やコア ) に割り当て同時に処理 並列計算機システム 複数のプロセッサをもつ 主にメモリに違いがある 共有メモリシステム 分散メモリシステム ハイブリッドシステム 957

21 共有メモリシステム 複数のプロセッサがメモリ空間を共有 分割した処理は各プロセッサ上で並列的に処理 共有されたメモリ空間上の変数は全ての CPU( やコア ) からアクセス ( 読み書き ) 可能 他からアクセスされない変数を持つことも可能 CPU CPU CPU CPU メモリ 958

22 並列処理の分類 タスク並列 独立なタスクを異なる CPU コアで同時に実行 データ並列 独立なタスクが処理するデータを分割し, 異なる CPU コアがデータを参照し, 処理を実行 Embarrassingly parallel (perfectly parallel) 各 CPU コアが同じタスクを異なるパラメータで実行 GPU が各ピクセルの色を決定し, ディスプレイに描画する処理 あるタスクに対してパラメータの影響を調査するような問題 959

23 データ並列 独立な処理 A,B,C が取り扱うデータを分割して実行 逐次処理 コア 処理 A 処理 B 処理 C 並列処理 コア 1 処理 A 処理 B 処理 C コア 2 処理 A 処理 B 処理 C 高速化 960

24 OpenMP 共有メモリシステムでの並列処理に利用 標準化されたオープンな規格 OpenMP をサポートしているコンパイラであれば同じ書き方が可能 並列化したい箇所をコンパイラに指示 ディレクティブ コンパイラが対応していなければコメントとして扱われる 修正が最小限で済み, 共通のソースコードで管理 961

25 OpenMP 並列に処理を実行させる箇所に指示句 ( ディレクティブ ) を挿入 for 文の並列化 ディレクティブを一行追加 (#pragma omp ~) #pragma omp parallel for for(int i=0; i<n; i++) C[i] = A[i] + B[i] 962

26 逐次 ( 並列化前 ) プログラム #include<stdio.h> #include<stdlib.h> #define N (1024*1024) #define Nbytes (N*sizeof(float)) int main(){ float *a,*b,*c; int i; a = (float *)malloc(nbytes); b = (float *)malloc(nbytes); c = (float *)malloc(nbytes); for(i=0; i<n; i++){ a[i] = 1.0; b[i] = 2.0; c[i] = 0.0; for(i=0; i<n; i++) c[i] = a[i] + b[i]; for(i=0; i<n; i++) printf("%f+%f=%f n", a[i],b[i],c[i]); return 0; 963

27 並列化プログラム #include<stdio.h> #include<stdlib.h> #define N (1024*1024) #define Nbytes (N*sizeof(float)) int main(){ float *a,*b,*c; int i; a = (float *)malloc(nbytes); b = (float *)malloc(nbytes); c = (float *)malloc(nbytes); #pragma omp parallel for for(i=0; i<n; i++){ a[i] = 1.0; b[i] = 2.0; c[i] = 0.0; #pragma omp parallel for for(i=0; i<n; i++) c[i] = a[i] + b[i]; for(i=0; i<n; i++) printf("%f+%f=%f n", a[i],b[i],c[i]); return 0; 964

28 並列化プログラム #include<stdio.h> #include<stdlib.h> #define N (1024*1024) #define Nbytes (N*sizeof(float)) int main(){ float *a,*b,*c; int i; a = (float *)malloc(nbytes); b = (float *)malloc(nbytes); c = (float *)malloc(nbytes); #pragma omp parallel { #pragma omp for for(i=0; i<n; i++){ a[i] = 1.0; b[i] = 2.0; c[i] = 0.0; #pragma omp for for(i=0; i<n; i++) c[i] = a[i] + b[i]; for(i=0; i<n; i++) printf("%f+%f=%f n", a[i],b[i],c[i]); return 0; 965

29 コンパイル コンパイル時にコンパイルオプションを付与 fopenmp fopenmp を付けるとディレクティブを処理 fopenmp を付けないとディレクティブは無視される 966

30 処理の並列化 データ並列 for ループをスレッドの数だけ分割 タスク並列もできる スレッド 1 スレッド 2 コア 1 for(i=0; i<n/2 1; i++) c[i] = a[i] + b[i]; a[i] b[i] コア 2 for(i=n/2; i<n; i++) c[i] = a[i] + b[i]; c[i] 967

31 OpenMP の指示文 並列処理制御 OpenMP で並列処理を行う領域の定義 並列実行領域 (Parallel Region) 構文 ワークシェアリング (Work sharing) 構文 同期制御 OpenMP 並列領域内でのデータアクセス, 命令実行の同期 データ属性制御 並列領域内で利用されるデータの属性を定義 その他 968

32 並列実行領域 (Parallel Region) 構文 parallel 構文 parallel 構文で指示された領域では指定されたスレッドが並列に処理を実行 全てのスレッドが同じ処理を実行 #pragma omp parallel //{ < ここに括弧を書くとエラー { 複数のスレッドが起動され, ここに書いてある処理を実行全てのスレッドが同じ処理を実行 969

33 ワークシェアリング (Work sharing) 構文 for 構文 parallel 構文で指定された並列実行領域内で利用 直後の for ループを各スレッドに分割して並列処理を実行 for( 初期化 ; 継続条件 ; 再初期化 ) で構成される for ループが対象 全てのスレッドが処理を終了するまで他のスレッドは待機 #pragma omp parallel { #pragma omp for for(i=0; i<n; i++){ for ループを自動的に分割して各スレッドが実行 全てのスレッドが処理を終了するまで待機 970

34 データ属性制御 shared 指示節 parallel 構文で指定された並列実行領域内での変数の取り扱いを指示 指定した変数を全てのスレッドで共有 int data; #pragma omp parallel shared(data) { 全てのスレッドが data を共有あるスレッドが data を変更すると, 他のスレッドが参照する data の値も変更 971

35 データ属性制御 private 指示節 parallel 構文で指定された並列実行領域内での変数の取り扱いを指示 指定した変数のコピーを全てのスレッドが個別に保持 コピーされた変数の値は引き継がれない 0もしくは未定義 for 構文でワークシェアされたfor 文のループカウンタは private int data; #pragma omp parallel private(data) { 全てのスレッドが data のコピーを個別に保持 972

36 データ属性制御 reduction 指示節 値の総和や最大値などを求める for 文の並列化に利用 結果を保持する変数のコピーが各スレッドに作成され, 並列処理の最後でまとめられる reduction(op: 変数 ) op は +,,*,&,,^,&&, のいずれか 変数 = 変数 op 変数 値 int sum=0, c[n]; #pragma omp parallel for reduction(+:sum) for(i=0; i<n; i++){ sum += c[i]; for ループを分割し, 各スレッドが sum を個別に保持して総和計算を実行 各スレッドの sum をまとめて総和を計算 973

37 OpenMP ランタイム API omp_set_num_threads 並列実行領域のスレッド数を指定 並列実行領域の直前で呼出 omp_get_num_threads omp_set_num_threads(4); #pragma omp parallel { 4 スレッドが起動し, 並列実行領域内の処理を実行 並列実行領域内で実行されているスレッド数を返す omp_set_num_threads(12); #pragma omp parallel { printf("%d n",omp_get_num_threads());//12 と表示 974

38 OpenMP ランタイム API omp_get_thread_num 並列実行領域内で実行されているスレッドに割り振られた番号を返す omp_get_wtime omp_set_num_threads(4); #pragma omp parallel { printf("%d n",omp_get_thread_num()); // 呼び出したスレッドに応じて 0~3 のいずれかを表示 倍精度浮動小数点で時間 ( 秒単位 ) を返す 全ての OS で実際の実行時間を取得可能 double time_start = omp_get_wtime();... double time_end = omp_get_wtime(); printf(" 実行時間 %f sec n",time_end time_start); 975

39 OpenMP を利用して複数 GPU を利用 #include<stdio.h> #include<stdlib.h> #include<omp.h> #define N (1024*1024*2) #define Nbytes (N*sizeof(float)) #define NT 256 #define NB (N/NT) #define GPUs 4 global void add (float *a, float *b, float *c){ int i = blockidx.x*blockdim.x + threadidx.x; c[i] = a[i] + b[i]; global void init (float *a, float *b, float *c){ int i = blockidx.x*blockdim.x + threadidx.x; a[i] = 1.0; b[i] = 2.0; c[i] = 0.0; vectoradd_omp.cu 976

40 OpenMP を利用して複数 GPU を利用 int main(){ float *a,*b,*c; float *host_c = (float *)malloc(nbytes); int th; omp_set_num_threads(gpus); #pragma omp parallel private(th,a,b,c) shared(host_c) { th = omp_get_thread_num(); cudasetdevice(th); cudamalloc((void **)&a,nbytes/gpus); cudamalloc((void **)&b,nbytes/gpus); cudamalloc((void **)&c,nbytes/gpus); init<<< NB/GPUs, NT >>>(a,b,c); add<<< NB/GPUs, NT >>>(a,b,c); cudamemcpy(&host_c[n/gpus * th], c, Nbytes/GPUs, cudamemcpydevicetohost); cudafree(a); cudafree(b); cudafree(c); double sum=0; for(int i=0;i<n;i++) sum+=host_c[i]; printf("%f n",sum/n); free(host_c); return 0; vectoradd_omp.cu 977

41 コンパイル コンパイルのみ実行し, オブジェクトファイルを作成 OpenMP ディレクティブが記述されたソース (.c,.cpp) は cc/gcc/g++ でコンパイル CUDA のカーネルが記述されたソース (.cu) は nvcc でコンパイル #pragma... cc fopenmp c cpu.c cpu.c cpu.o gpu.cu global void... nvcc c gpu.cu gpu.o 978

42 リンク オブジェクトファイルをリンクして実行ファイルを作成 OpenMP のランタイムライブラリ (libgomp) を追加 cpu.o nvcc cpu.o gpu.o lgomp a.out gpu.o 979

43 コンパイル コンパイルのみ実行し, オブジェクトファイルを作成 OpenMP ディレクティブと CUDA のカーネルが混在する場合 ソースファイルが一つだけなら c オプションは不要 nvcc でコンパイルからリンクまで実行できる gpu.cu global void... #pragma... nvcc c Xcompiler fopenmp gpu.cu gpu.o 980

44 リンク オブジェクトファイルをリンクして実行ファイルを作成 OpenMP のランタイムライブラリ (libgomp) を追加 ソースファイルが一つだけなら c オプションは不要 nvcc でコンパイルからリンクまで実行できる nvcc gpu.o lgomp gpu.o a.out 981

45 1 スレッドで複数の GPU を利用 #include<stdio.h> #include<stdlib.h> #define N (1024*1024*2) #define Nbytes (N*sizeof(float)) #define NT 256 #define NB (N/NT) #define GPUs 4 global void init (float *a, float *b, float *c){ int i = blockidx.x*blockdim.x + threadidx.x; global void add (float *a, float *b, float *c){ int i = blockidx.x*blockdim.x + threadidx.x; c[i] = a[i] + b[i]; a[i] = 1.0; b[i] = 2.0; c[i] = 0.0; vectoradd_multigpu.cu 982

46 1 スレッドで複数の GPU を利用 int main(){ float *a[gpus],*b[gpus],*c[gpus]; int dev; for(dev=0;dev<gpus;dev++){ cudasetdevice(dev); cudamalloc((void **)&a[dev],nbytes/gpus); cudamalloc((void **)&b[dev],nbytes/gpus); cudamalloc((void **)&c[dev],nbytes/gpus); for(dev=0;dev<gpus;dev++){ cudasetdevice(dev); init<<<nb/gpus,nt>>(a[dev],b[dev],c[dev]); add<<<nb/gpus,nt>>>(a[dev],b[dev],c[dev]); float *host_c = (float *)malloc(nbytes); for(dev=0;dev<gpus;dev++){ cudasetdevice(dev); cudamemcpy(&host_c[dev*n/gpus], c[dev], Nbytes/GPUs, cudamemcpydevicetohost); double sum=0; for(int i=0;i<n;i++)sum+=host_c[i]; printf("%f n",sum/n); free(host_c); for(dev=0;dev<gpus;dev++){ cudasetdevice(dev); cudafree(a[dev]); cudafree(b[dev]); cudafree(c[dev]); return 0; vectoradd_multigpu.cu 983

47 GPU Direct v2.0 2 個の GPU 間でデータを移動 ホストメモリを経由せず,GPU 間で peer to peer 通信 ホストメモリを経由した従来のデータコピー メモリ メモリ メモリ CPU GPU1 GPU2 PCI Ex 984

48 GPU Direct v2.0 2 個の GPU 間でデータを移動 ホストメモリを経由せず,GPU 間で peer to peer 通信 ホストメモリを経由した従来のデータコピー メモリ メモリ メモリ CPU GPU1 GPU2 PCI Ex 985

49 GPU Direct v2.0 2 個の GPU 間でデータを移動 ホストメモリを経由せず,GPU 間でpeer to peer 通信 同じIO Hubに接続されていることが条件 GPU Direct による peer to peer コピー メモリ メモリ メモリ CPU GPU1 GPU2 PCI Ex 986

50 GPU Direct v2.0 利用できるデバイス Fermi 以降の GPU 64 bit Linux もしくは Windows で動作 Windows の場合は Tesla GPU のみで利用可能 Linux の場合は GeForce でも利用可能 987

51 GPU Direct v2.0 を利用したデータ交換 手順 GPU を 2 個選択 GPU が peer to peer 通信可能かを確認 peer to peer 通信を個別に有効化 1 台目から 2 台目,2 台目から 1 台目 データをコピー 988

52 GPU Direct v2.0 を利用したデータ交換 GPU の選択 cudasetdevice( 使用 GPU 番号 ) cudasetdevice(1); GPU1 が使われる GPU が peer to peer 通信可能かを確認 cudadevicecanaccesspeer( 結果, アクセス元 GPU, アクセス先 GPU) cudadevicecanaccesspeer(&result,device0,device1); device0からdevice1にpeer 通信できるかをresultに書き込む 989

53 GPU Direct v2.0 を利用したデータ交換 Peer to peer 通信を個別に有効化 cudadeviceenablepeeraccess( アクセス先 GPU,0); cudasetdevice(2); cudadeviceenablepeeraccess(3,0); GPU2から3へのpeer 通信を有効化 データをコピー cudamemcpypeer( コピー先 GPU, コピー先変数, コピー元 GPU, コピー元変数, 変数サイズ ); cudamemcpypeer(3, b, 2, a, sizeof(float)*100); GPU2の変数 aからgpu3の変数 bへfloat 型 100 個分コピー 990

54 GPU Direct による P2P 通信 #include<stdio.h> #include<stdlib.h> #include<math.h> #define N #define Bytes (N*sizeof(float)) void p2p (float *, float *, float *, float *); int main(void){ float *a = (float *)malloc(bytes); float *b = (float *)malloc(bytes); float *a_cp=(float *)malloc(bytes); float *b_cp=(float *)malloc(bytes); for(int i=0;i<n;i++){ a[i]=i+1; b[i]=2*(i+1); a_cp[i]=0; b_cp[i]=0; //a,b をそれぞれ a_cp,b_cp にコピー p2p(a,b,a_cp,b_cp); // 正しくコピーできているかチェック int num_error=0; for(int i=0;i<n;i++) if(abs(a[i] a_cp[i])>0.1f) num_error++; printf("error = %d n",num_error); num_error=0; for(int i=0;i<n;i++) if(abs(b[i] b_cp[i])>0.1f) num_error++; printf("error = %d n",num_error); return 0; peer2peer.cu 991

55 GPU Direct による P2P 通信 void p2p(float *a, float *b, float *a_cp, float *b_cp){ float *dev0_a, *dev0_b; float *dev1_a, *dev1_b; cudadeviceprop deviceprop; int dev0, dev1, canaccess0to1, canaccess1to0; // 使用する GPU を選択.dev0 が 1 台目,dev1 が 2 台目 dev0 = 2; dev1 = 3; //peer to peer 通信が可能な GPU かチェックする //1 台目から 2 台目へ P2P 通信が可能かチェック cudadevicecanaccesspeer(&canaccess0to1, dev0, dev1); //2 台目から 1 台目へ P2P 通信が可能かチェック cudadevicecanaccesspeer(&canaccess1to0, dev1, dev0); printf("dev 0 To 1 P2P access = %d n dev 1 To 0 P2P access = %d n",canaccess0to1,canaccess1to0); peer2peer.cu 992

56 GPU Direct による P2P 通信 //2 台の GPU がお互いに P2P 通信できるならデータコピーを実行 if(canaccess0to1 == 1 && canaccess1to0 == 1){ //1 台目の GPU が UVA をサポートしているかをチェック cudasetdevice(dev0); cudagetdeviceproperties(&deviceprop, dev0); printf("device %d supports Unified Virtual Addressing : %d n",dev0, deviceprop.unifiedaddressing); //1 台目から 2 台目への P2P 通信を有効化.2 個目の引数は必ず 0 cudadeviceenablepeeraccess(dev1,0); //2 台目の GPU が UVA をサポートしているかをチェック cudasetdevice(dev1); cudagetdeviceproperties(&deviceprop, dev1); printf("device %d supports Unified Virtual Addressing : %d n",dev1, deviceprop.unifiedaddressing); //2 台目から 1 台目への P2P 通信を有効化.2 個目の引数は必ず 0 cudadeviceenablepeeraccess(dev0,0); peer2peer.cu 993

57 GPU Direct による P2P 通信 //1 台目の GPU で使うメモリを確保し, 変数 a を CPU から GPU へコピー (dev0_b は未初期化 ) cudasetdevice(dev0); cudamalloc((void **)&dev0_a, Bytes); cudamalloc((void **)&dev0_b, Bytes); cudamemcpy(dev0_a, a, Bytes, cudamemcpyhosttodevice); //2 台目の GPU で使うメモリを確保し, 変数 b を CPU から GPU へコピー (dev1_a は未初期化 ) cudasetdevice(dev1); cudamalloc((void **)&dev1_a, Bytes); cudamalloc((void **)&dev1_b, Bytes); cudamemcpy(dev1_b, b, Bytes, cudamemcpyhosttodevice); cudasetdevice(dev0); //2 台目の GPU(dev1) にある dev1_a へ,1 台目の GPU(dev0) の dev0_a を Bytes 分コピー cudamemcpypeer(dev1_a, dev1, dev0_a, dev0, Bytes); //1 台目の GPU(dev0) にある dev0_b へ,2 台目の GPU(dev1) の dev1_b を Bytes 分コピー cudamemcpypeer(dev0_b, dev0, dev1_b, dev1, Bytes); peer2peer.cu 994

58 GPU Direct による P2P 通信 //1 台目の GPU(dev0) にある dev0_b を,CPU へコピー cudasetdevice(dev0); cudamemcpy(b_cp,dev0_b, Bytes, cudamemcpydevicetohost); //2 台目の GPU(dev1) にある dev1_a を,CPU へコピー cudasetdevice(dev1); cudamemcpy(a_cp,dev1_a, Bytes, cudamemcpydevicetohost); //1 台目の GPU(dev0) で確保したメモリをクリア cudasetdevice(dev0); cudafree(dev0_a); cudafree(dev0_b); cudadevicedisablepeeraccess(dev1);//dev1 への Peer 通信を無効化 //2 台目の GPU(dev1) で確保したメモリをクリア cudasetdevice(dev1); cudafree(dev1_a); cudafree(dev1_b); cudadevicedisablepeeraccess(dev0);//dev0 への Peer 通信を無効化 peer2peer.cu 995

59 Unified Virtual Addressing 複数の GPU のメモリアドレスと,cudaHostAlloc() で確保した CPU のメモリアドレスを統一的に管理 40 bit メモリ空間を構成 異なる GPU のメモリや CPU のメモリの区別が不要 異なる GPU に置かれたメモリを参照可能 GPU direct を利用してアクセス cudadeviceenablepeeraccess を利用 記述は楽になるが性能は出ない 996

60 UVA を利用したベクトル和 #include <stdio.h> #include <stdlib.h> #define N (1024*1024*1) #define Nbytes (N*sizeof(float)) #define NT 256 #define NB (N/NT) // カーネルは変更なし global void init (float *a, float *b, float *c){ int i = blockidx.x*blockdim.x + threadidx.x; // カーネルは変更なし global void add (float *a, float *b, float *c){ int i = blockidx.x*blockdim.x + threadidx.x; c[i] = a[i] + b[i]; a[i] = 1.0; b[i] = 2.0; c[i] = 0.0; vectoradd_uva.cu 997

61 UVA を利用したベクトル和 int main(void){ int dev0,dev1; float *a,*b,*c; // 使用する GPU を選択.dev0 が 1 台目,dev1 が 2 台目 dev0 = 2; dev1 = 3; int canaccess1to0=0; //2 台目から1 台目へP2P 通信が可能かチェック cudadevicecanaccesspeer(&canaccess1to0, dev1, dev0); printf("dev 1 To 0 P2P access = %d n",canaccess1to0); //2 台目から1 台目へP2P 通信が可能ならif 文の中を実行 if(canaccess1to0 == 1){ //1 台目のGPUでメモリを確保 ( 変数 a,b,cは1 台目のメモリに存在 ) cudasetdevice(dev0); cudamalloc( (void **)&a, Nbytes); cudamalloc( (void **)&b, Nbytes); cudamalloc( (void **)&c, Nbytes); vectoradd_uva.cu 998

62 UVA を利用したベクトル和 //2 台目の GPU を利用するようにデバイスを切替 cudasetdevice(dev1); //2 台目から 1 台目への P2P 通信を有効化.2 個目の引数は必ず 0 cudadeviceenablepeeraccess(dev0, 0); //1 台目の GPU のメモリを参照して 2 台目の GPU で初期化とベクトル和を実行 init<<<nb, NT>>>(a, b, c); add<<<nb, NT>>>(a, b, c); //2 台目の GPU が 1 台目の GPU のメモリを CPU へコピー float *host_c = (float *)malloc(nbytes); cudamemcpy(host_c, c, Nbytes, cudamemcpydevicetohost); int i;double sum=0; for(i=0;i<n;i++)sum+=host_c[i]; printf("%f n",sum/n); free(host_c); // 利用する GPU を 1 台目に切り替えて確保したメモリをクリア cudasetdevice(dev0); cudafree(a); cudafree(b); cudafree(c); vectoradd_uva.cu 999

63 UVA を利用したベクトル和 else{//p2p 通信が不可能なら 1 台の GPU で実行 cudamalloc( (void **)&a, Nbytes); cudamalloc( (void **)&b, Nbytes); cudamalloc( (void **)&c, Nbytes); init<<<nb, NT>>>(a, b, c); add<<<nb, NT>>>(a, b, c); float *host_c = (float *)malloc(nbytes); cudamemcpy(host_c, c, Nbytes, cudamemcpydevicetohost); int i;double sum=0; for(i=0;i<n;i++)sum+=host_c[i]; printf("%f n",sum/n); free(host_c); cudafree(a); cudafree(b); cudafree(c); return 0; vectoradd_uva.cu 1000

64 実行結果 配列の要素数 N=2 20 カーネル 単一 GPU 実行時間 [ms] UVA 初期化 init ベクトル和 add Unified Virtual Addressing を利用して P2P アクセスすると 10~20 倍以上の時間を要する 大量のデータにアクセスせず, 限定的な利用が重要 データが少なく, わざわざコピーするまでもない場合等 1001

Microsoft PowerPoint - GPGPU実践基礎工学(web).pptx

Microsoft PowerPoint - GPGPU実践基礎工学(web).pptx 並列計算の概念 ( プロセスとスレッド ) 長岡技術科学大学電気電子情報工学専攻出川智啓 今回の内容 並列計算の分類 並列アーキテクチャ 並列計算機システム 並列処理 プロセスとスレッド スレッド並列化 OpenMP プロセス並列化 MPI 249 CPU の性能の変化 動作クロックを向上させることで性能を向上 http://pc.watch.impress.co.jp/docs/2003/0227/kaigai01.htm

More information

( CUDA CUDA CUDA CUDA ( NVIDIA CUDA I

(    CUDA CUDA CUDA CUDA (  NVIDIA CUDA I GPGPU (II) GPGPU CUDA 1 GPGPU CUDA(CUDA Unified Device Architecture) CUDA NVIDIA GPU *1 C/C++ (nvcc) CUDA NVIDIA GPU GPU CUDA CUDA 1 CUDA CUDA 2 CUDA NVIDIA GPU PC Windows Linux MaxOSX CUDA GPU CUDA NVIDIA

More information

演習1: 演習準備

演習1: 演習準備 演習 1: 演習準備 2013 年 8 月 6 日神戸大学大学院システム情報学研究科森下浩二 1 演習 1 の内容 神戸大 X10(π-omputer) について システム概要 ログイン方法 コンパイルとジョブ実行方法 OpenMP の演習 ( 入門編 ) 1. parallel 構文 実行時ライブラリ関数 2. ループ構文 3. shared 節 private 節 4. reduction 節

More information

Microsoft PowerPoint - OpenMP入門.pptx

Microsoft PowerPoint - OpenMP入門.pptx OpenMP 入門 須田礼仁 2009/10/30 初版 OpenMP 共有メモリ並列処理の標準化 API http://openmp.org/ 最新版は 30 3.0 バージョンによる違いはあまり大きくない サポートしているバージョンはともかく csp で動きます gcc も対応しています やっぱり SPMD Single Program Multiple Data プログラム #pragma omp

More information

Slide 1

Slide 1 CUDA プログラミングの基本 パート I - ソフトウェアスタックとメモリ管理 CUDA の基本の概要 パート I CUDAのソフトウェアスタックとコンパイル GPUのメモリ管理 パートII カーネルの起動 GPUコードの具体項目 注 : 取り上げているのは基本事項のみです そのほか多数の API 関数についてはプログラミングガイドを ご覧ください CUDA インストレーション CUDA インストレーションの構成

More information

NUMAの構成

NUMAの構成 共有メモリを使ったデータ交換と同期 慶應義塾大学理工学部 天野英晴 hunga@am.ics.keio.ac.jp 同期の必要性 あるプロセッサが共有メモリに書いても 別のプロセッサにはそのことが分からない 同時に同じ共有変数に書き込みすると 結果がどうなるか分からない そもそも共有メモリって結構危険な代物 多くのプロセッサが並列に動くには何かの制御機構が要る 不可分命令 同期用メモリ バリア同期機構

More information

N 体問題 長岡技術科学大学電気電子情報工学専攻出川智啓

N 体問題 長岡技術科学大学電気電子情報工学専攻出川智啓 N 体問題 長岡技術科学大学電気電子情報工学専攻出川智啓 今回の内容 天体の運動方程式 天体運動の GPU 実装 最適化による性能変化 #pragma unroll 855 計算の種類 画像処理, 差分法 空間に固定された観測点を配置 観測点 ( 固定 ) 観測点上で物理量がどのように変化するかを追跡 Euler 型 多粒子の運動 観測点を配置せず, 観測点が粒子と共に移動 Lagrange 型 観測点

More information

Slides: TimeGraph: GPU Scheduling for Real-Time Multi-Tasking Environments

Slides: TimeGraph: GPU Scheduling for Real-Time Multi-Tasking Environments 計算機アーキテクチャ第 11 回 マルチプロセッサ 本資料は授業用です 無断で転載することを禁じます 名古屋大学 大学院情報科学研究科 准教授加藤真平 デスクトップ ジョブレベル並列性 スーパーコンピュータ 並列処理プログラム プログラムの並列化 for (i = 0; i < N; i++) { x[i] = a[i] + b[i]; } プログラムの並列化 x[0] = a[0] + b[0];

More information

Microsoft Word - openmp-txt.doc

Microsoft Word - openmp-txt.doc ( 付録 A) OpenMP チュートリアル OepnMP は 共有メモリマルチプロセッサ上のマルチスレッドプログラミングのための API です 本稿では OpenMP の簡単な解説とともにプログラム例をつかって説明します 詳しくは OpenMP の規約を決めている OpenMP ARB の http://www.openmp.org/ にある仕様書を参照してください 日本語訳は http://www.hpcc.jp/omni/spec.ja/

More information

コードのチューニング

コードのチューニング OpenMP による並列化実装 八木学 ( 理化学研究所計算科学研究センター ) KOBE HPC Spring School 2019 2019 年 3 月 14 日 スレッド並列とプロセス並列 スレッド並列 OpenMP 自動並列化 プロセス並列 MPI プロセス プロセス プロセス スレッドスレッドスレッドスレッド メモリ メモリ プロセス間通信 Private Private Private

More information

1. GPU コンピューティング GPU コンピューティング GPUによる 汎用コンピューティング GPU = Graphics Processing Unit CUDA Compute Unified Device Architecture NVIDIA の GPU コンピューティング環境 Lin

1. GPU コンピューティング GPU コンピューティング GPUによる 汎用コンピューティング GPU = Graphics Processing Unit CUDA Compute Unified Device Architecture NVIDIA の GPU コンピューティング環境 Lin Windows で始める CUDA 入門 GTC 2013 チュートリアル エヌビディアジャパン CUDA エンジニア森野慎也 1. GPU コンピューティング GPU コンピューティング GPUによる 汎用コンピューティング GPU = Graphics Processing Unit CUDA Compute Unified Device Architecture NVIDIA の GPU コンピューティング環境

More information

memo

memo 計数工学プログラミング演習 ( 第 3 回 ) 2016/04/26 DEPARTMENT OF MATHEMATICAL INFORMATICS 1 内容 ポインタ malloc 構造体 2 ポインタ あるメモリ領域 ( アドレス ) を代入できる変数 型は一致している必要がある 定義時には値は不定 ( 何も指していない ) 実際にはどこかのメモリを指しているので, #include

More information

Slide 1

Slide 1 CUDA プログラミングの基本 パート II - カーネル CUDA の基本の概要 パート I CUDAのソフトウェアスタックとコンパイル GPUのメモリ管理 パート II カーネルの起動 GPUコードの具体像 注 : 取り上げているのは基本事項のみです そのほか多数の API 関数についてはプログラミングガイドを ご覧ください GPU 上でのコードの実行 カーネルは C 関数 + 多少の制約 ホストメモリはアクセスできない戻り値型は

More information

Microsoft PowerPoint - 03_What is OpenMP 4.0 other_Jan18

Microsoft PowerPoint - 03_What is OpenMP 4.0 other_Jan18 OpenMP* 4.x における拡張 OpenMP 4.0 と 4.5 の機能拡張 内容 OpenMP* 3.1 から 4.0 への拡張 OpenMP* 4.0 から 4.5 への拡張 2 追加された機能 (3.1 -> 4.0) C/C++ 配列シンタックスの拡張 SIMD と SIMD 対応関数 デバイスオフロード task 構 の依存性 taskgroup 構 cancel 句と cancellation

More information

(Microsoft PowerPoint \215u\213`4\201i\221\272\210\344\201j.pptx)

(Microsoft PowerPoint \215u\213`4\201i\221\272\210\344\201j.pptx) AICS 村井均 RIKEN AICS HPC Summer School 2012 8/7/2012 1 背景 OpenMP とは OpenMP の基本 OpenMP プログラミングにおける注意点 やや高度な話題 2 共有メモリマルチプロセッサシステムの普及 共有メモリマルチプロセッサシステムのための並列化指示文を共通化する必要性 各社で仕様が異なり 移植性がない そして いまやマルチコア プロセッサが主流となり

More information

memo

memo 計数工学プログラミング演習 ( 第 3 回 ) 2017/04/25 DEPARTMENT OF MATHEMATICAL INFORMATICS 1 内容 ポインタの続き 引数の値渡しと参照渡し 構造体 2 ポインタで指されるメモリへのアクセス double **R; 型 R[i] と *(R+i) は同じ意味 意味 R double ** ポインタの配列 ( の先頭 ) へのポインタ R[i]

More information

Microsoft PowerPoint - GPGPU実践基礎工学(web).pptx

Microsoft PowerPoint - GPGPU実践基礎工学(web).pptx GPU のメモリ階層 長岡技術科学大学電気電子情報工学専攻出川智啓 今回の内容 GPU のメモリ階層 グローバルメモリ 共有メモリ モザイク処理への適用 コンスタントメモリ 空間フィルタへの適用 577 GPU の主要部品 基盤 GPU( チップ )+ 冷却部品 画面出力端子 電源入力端子 メモリ 特性の把握が重要 電源入力端子 画面出力端子 メモリ チップ PCI Ex 端子 http://www.geforce.com/whats

More information

熊本大学学術リポジトリ Kumamoto University Repositor Title GPGPU による高速演算について Author(s) 榎本, 昌一 Citation Issue date Type URL Presentation

熊本大学学術リポジトリ Kumamoto University Repositor Title GPGPU による高速演算について Author(s) 榎本, 昌一 Citation Issue date Type URL Presentation 熊本大学学術リポジトリ Kumamoto University Repositor Title GPGPU による高速演算について Author(s) 榎本, 昌一 Citation Issue date 2011-03-17 Type URL Presentation http://hdl.handle.net/2298/23539 Right GPGPU による高速演算について 榎本昌一 東京大学大学院工学系研究科システム創成学専攻

More information

Microsoft PowerPoint - 計算機言語 第7回.ppt

Microsoft PowerPoint - 計算機言語 第7回.ppt 計算機言語第 7 回 長宗高樹 目的 関数について理解する. 入力 X 関数 f 出力 Y Y=f(X) 関数の例 関数の型 #include int tasu(int a, int b); main(void) int x1, x2, y; x1 = 2; x2 = 3; y = tasu(x1,x2); 実引数 printf( %d + %d = %d, x1, x2, y);

More information

CUDA 連携とライブラリの活用 2

CUDA 連携とライブラリの活用 2 1 09:30-10:00 受付 10:00-12:00 Reedbush-H ログイン GPU 入門 13:30-15:00 OpenACC 入門 15:15-16:45 OpenACC 最適化入門と演習 17:00-18:00 OpenACC の活用 (CUDA 連携とライブラリの活用 ) CUDA 連携とライブラリの活用 2 3 OpenACC 簡単にGPUプログラムが作成できる それなりの性能が得られる

More information

プログラミング実習I

プログラミング実習I プログラミング実習 I 05 関数 (1) 人間システム工学科井村誠孝 m.imura@kwansei.ac.jp 関数とは p.162 数学的には入力に対して出力が決まるもの C 言語では入出力が定まったひとまとまりの処理 入力や出力はあるときもないときもある main() も関数の一種 何かの仕事をこなしてくれる魔法のブラックボックス 例 : printf() 関数中で行われている処理の詳細を使う側は知らないが,

More information

GPU のアーキテクチャとプログラム構造 長岡技術科学大学電気電子情報工学専攻出川智啓

GPU のアーキテクチャとプログラム構造 長岡技術科学大学電気電子情報工学専攻出川智啓 GPU のアーキテクチャとプログラム構造 長岡技術科学大学電気電子情報工学専攻出川智啓 今回の内容 GPU のアーキテクチャ CUDA CUDA によるプログラミング 58 GPU(Graphics Processing Unit) とは 画像処理専用のハードウェア 具体的には画像処理用のチップ チップ単体では販売されていない PCI Ex カードで販売 ( チップ単体と区別せずに GPU と呼ぶことも多い

More information

enshu5_4.key

enshu5_4.key http://www.mmsonline.com/articles/parallel-processing-speeds-toolpath-calculations TA : 菅 新 菅沼智史 水曜 新行紗弓 馬淵隼 木曜 情報知能工学演習V (前半第4週) 政田洋平 システム情報学研究科計算科学専攻 演習 V( 前半 ) の内容 第 1 週 : 高性能計算 (High Performance Computing

More information

memo

memo 数理情報工学演習第一 C プログラミング演習 ( 第 5 回 ) 2015/05/11 DEPARTMENT OF MATHEMATICAL INFORMATICS 1 今日の内容 : プロトタイプ宣言 ヘッダーファイル, プログラムの分割 課題 : 疎行列 2 プロトタイプ宣言 3 C 言語では, 関数や変数は使用する前 ( ソースの上のほう ) に定義されている必要がある. double sub(int

More information

02_C-C++_osx.indd

02_C-C++_osx.indd C/C++ OpenMP* / 2 C/C++ OpenMP* OpenMP* 9.0 1... 2 2... 3 3OpenMP*... 5 3.1... 5 3.2 OpenMP*... 6 3.3 OpenMP*... 8 4OpenMP*... 9 4.1... 9 4.2 OpenMP*... 9 4.3 OpenMP*... 10 4.4... 10 5OpenMP*... 11 5.1

More information

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ 今回のプログラミングの課題 次のステップによって 徐々に難易度の高いプログラムを作成する ( 参照用の番号は よくわかる C 言語 のページ番号 ) 1. キーボード入力された整数 10 個の中から最大のものを答える 2. 整数を要素とする配列 (p.57-59) に初期値を与えておき

More information

07-二村幸孝・出口大輔.indd

07-二村幸孝・出口大輔.indd GPU Graphics Processing Units HPC High Performance Computing GPU GPGPU General-Purpose computation on GPU CPU GPU GPU *1 Intel Quad-Core Xeon E5472 3.0 GHz 2 6 MB L2 cache 1600 MHz FSB 80 GFlops 1 nvidia

More information

SuperH RISC engineファミリ用 C/C++コンパイラパッケージ V.7~V.9 ご使用上のお願い

SuperH RISC engineファミリ用 C/C++コンパイラパッケージ V.7~V.9 ご使用上のお願い ツールニュース RENESAS TOOL NEWS 2014 年 02 月 01 日 : 140201/tn1 SuperH RISC engine ファミリ用 C/C++ コンパイラパッケージ V.7~V.9 ご使用上のお願い SuperH RISC engine ファミリ用 C/C++ コンパイラパッケージ V.7~V.9の使用上の注意事項 4 件を連絡します 同一ループ内の異なる配列要素に 同一の添え字を使用した場合の注意事項

More information

GPU チュートリアル :OpenACC 篇 Himeno benchmark を例題として 高エネルギー加速器研究機構 (KEK) 松古栄夫 (Hideo Matsufuru) 1 December 2018 HPC-Phys 理化学研究所 共通コードプロジェクト

GPU チュートリアル :OpenACC 篇 Himeno benchmark を例題として 高エネルギー加速器研究機構 (KEK) 松古栄夫 (Hideo Matsufuru) 1 December 2018 HPC-Phys 理化学研究所 共通コードプロジェクト GPU チュートリアル :OpenACC 篇 Himeno benchmark を例題として 高エネルギー加速器研究機構 (KEK) 松古栄夫 (Hideo Matsufuru) 1 December 2018 HPC-Phys 勉強会 @ 理化学研究所 共通コードプロジェクト Contents Hands On 環境について Introduction to GPU computing Introduction

More information

プログラミングI第10回

プログラミングI第10回 プログラミング 1 第 10 回 構造体 (3) 応用 リスト操作 この資料にあるサンプルプログラムは /home/course/prog1/public_html/2007/hw/lec/sources/ 下に置いてありますから 各自自分のディレクトリにコピーして コンパイル 実行してみてください Prog1 2007 Lec 101 Programming1 Group 19992007 データ構造

More information

AICS 村井均 RIKEN AICS HPC Summer School /6/2013 1

AICS 村井均 RIKEN AICS HPC Summer School /6/2013 1 AICS 村井均 RIKEN AICS HPC Summer School 2013 8/6/2013 1 背景 OpenMP とは OpenMP の基本 OpenMP プログラミングにおける注意点 やや高度な話題 2 共有メモリマルチプロセッサシステムの普及 共有メモリマルチプロセッサシステムのための並列化指示文を共通化する必要性 各社で仕様が異なり 移植性がない そして いまやマルチコア プロセッサが主流となり

More information

cp-7. 配列

cp-7. 配列 cp-7. 配列 (C プログラムの書き方を, パソコン演習で学ぶシリーズ ) https://www.kkaneko.jp/cc/adp/index.html 金子邦彦 1 本日の内容 例題 1. 月の日数配列とは. 配列の宣言. 配列の添え字. 例題 2. ベクトルの内積例題 3. 合計点と平均点例題 4. 棒グラフを描く配列と繰り返し計算の関係例題 5. 行列の和 2 次元配列 2 今日の到達目標

More information

研究背景 大規模な演算を行うためには 分散メモリ型システムの利用が必須 Message Passing Interface MPI 並列プログラムの大半はMPIを利用 様々な実装 OpenMPI, MPICH, MVAPICH, MPI.NET プログラミングコストが高いため 生産性が悪い 新しい並

研究背景 大規模な演算を行うためには 分散メモリ型システムの利用が必須 Message Passing Interface MPI 並列プログラムの大半はMPIを利用 様々な実装 OpenMPI, MPICH, MVAPICH, MPI.NET プログラミングコストが高いため 生産性が悪い 新しい並 XcalableMPによる NAS Parallel Benchmarksの実装と評価 中尾 昌広 李 珍泌 朴 泰祐 佐藤 三久 筑波大学 計算科学研究センター 筑波大学大学院 システム情報工学研究科 研究背景 大規模な演算を行うためには 分散メモリ型システムの利用が必須 Message Passing Interface MPI 並列プログラムの大半はMPIを利用 様々な実装 OpenMPI,

More information

関数 C 言語は関数の言語 関数とは 関数の定義 : f(x) = x * x ; 使うときは : y = f(x) 戻り値 引数

関数 C 言語は関数の言語 関数とは 関数の定義 : f(x) = x * x ; 使うときは : y = f(x) 戻り値 引数 関数 C 言語は関数の言語 関数とは 関数の定義 : f(x) = x * x ; 使うときは : y = f(x) 戻り値 引数 関数の定義 戻り値の型 関数名 引数の型 引数の名前 int funcname ( int a, char b) { int c ; c = a * b ; return c ; 引数の型 引数の名前 戻り値 戻り値の型は int 変数 c の型も int return

More information

Microsoft PowerPoint - GPGPU実践基礎工学(web).pptx

Microsoft PowerPoint - GPGPU実践基礎工学(web).pptx GPU のプログラム構造 長岡技術科学大学電気電子情報工学専攻出川智啓 今回の内容 GPU プログラミング環境 (CUDA) GPU プログラムの実行の流れ CUDA によるプログラムの記述 カーネル (GPU で処理する関数 ) の構造 記述方法とその理由 GPU 固有のパラメータの確認 405 GPU(Graphics Processing Unit) とは 画像処理専用のハードウェア 具体的には画像処理用のチップ

More information

NUMAの構成

NUMAの構成 メッセージパッシング プログラミング 天野 共有メモリ対メッセージパッシング 共有メモリモデル 共有変数を用いた単純な記述自動並列化コンパイラ簡単なディレクティブによる並列化 :OpenMP メッセージパッシング 形式検証が可能 ( ブロッキング ) 副作用がない ( 共有変数は副作用そのもの ) コストが小さい メッセージパッシングモデル 共有変数は使わない 共有メモリがないマシンでも実装可能 クラスタ

More information

Microsoft PowerPoint - 11.pptx

Microsoft PowerPoint - 11.pptx ポインタと配列 ポインタと配列 配列を関数に渡す 法 課題 : 配列によるスタックの実現 ポインタと配列 (1/2) a が配列であるとき, 変数の場合と同様に, &a[0] [] の値は配列要素 a[0] のアドレス. C 言語では, 配列は主記憶上の連続領域に割り当てられるようになっていて, 配列名 a はその配列に割り当てられた領域の先頭番地となる. したがって,&a[0] と a は同じ値.

More information

NUMAの構成

NUMAの構成 GPU のプログラム 天野 アクセラレータとは? 特定の性質のプログラムを高速化するプロセッサ 典型的なアクセラレータ GPU(Graphic Processing Unit) Xeon Phi FPGA(Field Programmable Gate Array) 最近出て来た Deep Learning 用ニューロチップなど Domain Specific Architecture 1GPGPU:General

More information

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用 RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用体型のローカル変数を文字列操作関数で操作する場合の注意事項 (RXC#013) 配列型構造体または共用体の配列型メンバから読み出した値を動的初期化に用いる場合の注意事項

More information

CUDA を用いた画像処理 画像処理を CUDA で並列化 基本的な並列化の考え方 目標 : 妥当な Naïve コードが書ける 最適化の初歩がわかる ブロックサイズ メモリアクセスパターン

CUDA を用いた画像処理 画像処理を CUDA で並列化 基本的な並列化の考え方 目標 : 妥当な Naïve コードが書ける 最適化の初歩がわかる ブロックサイズ メモリアクセスパターン CUDA 画像処理入門 エヌビディアジャパン CUDA エンジニア森野慎也 GTC Japan 2014 CUDA を用いた画像処理 画像処理を CUDA で並列化 基本的な並列化の考え方 目標 : 妥当な Naïve コードが書ける 最適化の初歩がわかる ブロックサイズ メモリアクセスパターン RGB Y( 輝度 ) 変換 カラー画像から グレイスケールへの変換 Y = 0.299 R + 0.587

More information

C C UNIX C ( ) 4 1 HTML 1

C C UNIX C ( ) 4 1 HTML 1 C 2007 4 18 C UNIX 1 2 1 1.1 C ( ) 4 1 HTML 1 はじめ mkdir work 作業用ディレクトリーの作成 emacs hoge.c& エディターによりソースプログラム作成 gcc -o fuga hoge.c コンパイルにより機械語に変換 コンパイルエラー./fuga 実行 実行時エラー 完成 1: work hooge.c fuga 1 4 4 1 1.

More information

kiso2-09.key

kiso2-09.key 座席指定はありません 計算機基礎実習II 2018 のウェブページか 第9回 ら 以下の課題に自力で取り組んで下さい 計算機基礎実習II 第7回の復習課題(rev07) 第9回の基本課題(base09) 第8回試験の結果 中間試験に関するコメント コンパイルできない不完全なプログラムなど プログラミングに慣れていない あるいは複雑な問題は 要件 をバラして段階的にプログラムを作成する exam08-2.c

More information

01_OpenMP_osx.indd

01_OpenMP_osx.indd OpenMP* / 1 1... 2 2... 3 3... 5 4... 7 5... 9 5.1... 9 5.2 OpenMP* API... 13 6... 17 7... 19 / 4 1 2 C/C++ OpenMP* 3 Fortran OpenMP* 4 PC 1 1 9.0 Linux* Windows* Xeon Itanium OS 1 2 2 WEB OS OS OS 1 OS

More information

3次多項式パラメタ推定計算の CUDAを用いた実装 (CUDAプログラミングの練習として) Implementation of the Estimation of the parameters of 3rd-order-Polynomial with CUDA

3次多項式パラメタ推定計算の CUDAを用いた実装 (CUDAプログラミングの練習として)  Implementation of the Estimation of the parameters of 3rd-order-Polynomial with CUDA 3 次多項式パラメタ推定計算の CUDA を用いた実装 (CUDA プログラミングの練習として ) Estimating the Parameters of 3rd-order-Polynomial with CUDA ISS 09/11/12 問題の選択 目的 CUDA プログラミングを経験 ( 試行錯誤と習得 ) 実際に CPU のみの場合と比べて高速化されることを体験 問題 ( インプリメントする内容

More information

TSUBAME2.0 における GPU の 活用方法 東京工業大学学術国際情報センター丸山直也第 10 回 GPU コンピューティング講習会 2011 年 9 月 28 日

TSUBAME2.0 における GPU の 活用方法 東京工業大学学術国際情報センター丸山直也第 10 回 GPU コンピューティング講習会 2011 年 9 月 28 日 TSUBAME2.0 における GPU の 活用方法 東京工業大学学術国際情報センター丸山直也第 10 回 GPU コンピューティング講習会 2011 年 9 月 28 日 目次 1. TSUBAMEのGPU 環境 2. プログラム作成 3. プログラム実行 4. 性能解析 デバッグ サンプルコードは /work0/gsic/seminars/gpu- 2011-09- 28 からコピー可能です 1.

More information

Microsoft PowerPoint - OS07.pptx

Microsoft PowerPoint - OS07.pptx この資料は 情報工学レクチャーシリーズ松尾啓志著 ( 森北出版株式会社 ) を用いて授業を行うために 名古屋工業大学松尾啓志 津邑公暁が作成しました 主記憶管理 主記憶管理基礎 パワーポイント 27 で最終版として保存しているため 変更はできませんが 授業でお使いなる場合は松尾 (matsuo@nitech.ac.jp) まで連絡いただければ 編集可能なバージョンをお渡しする事も可能です 復習 OS

More information

TSUBAME2.0におけるGPUの 活用方法

TSUBAME2.0におけるGPUの 活用方法 GPU プログラミング 基礎編 東京工業大学学術国際情報センター 1. GPU コンピューティングと TSUBAME2.0 スーパーコンピュータ GPU コンピューティングとは グラフィックプロセッサ (GPU) は グラフィック ゲームの画像計算のために 進化を続けてきた 現在 CPU のコア数は 2~12 個に対し GPU 中には数百コア その GPU を一般アプリケーションの高速化に利用! GPGPU

More information

Microsoft Word - no11.docx

Microsoft Word - no11.docx 3. 関数 3.1 関数関数は数学の関数と同じようなイメージを持つと良いでしょう 例えば三角関数の様に一つの実数値 ( 角度 ) から値を求めますし 対数関数の様に二つの値から一つの値を出すものもあるでしょう これをイメージしてもらえば結構です つまり 何らかの値を渡し それをもとに何かの作業や計算を行い その結果を返すのが関数です C 言語の関数も基本は同じです 0 cos 1 cos(0) =

More information

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科 バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科 ポインタ変数の扱い方 1 ポインタ変数の宣言 int *p; double *q; 2 ポインタ変数へのアドレスの代入 int *p; と宣言した時,p がポインタ変数 int x; と普通に宣言した変数に対して, p = &x; は x のアドレスのポインタ変数 p への代入 ポインタ変数の扱い方 3 間接参照 (

More information

24th Embarcadero Developer Camp

24th Embarcadero Developer Camp 17 Th Developer Camp B4 Delphi/C++Builder テクニカルワークショップ Delphi / C++Builder 旧バージョンアプリケーションの移行 エンバカデロ テクノロジーズサポートチーム with 高橋智宏 1 17 Th Developer Camp Delphi Q1 2 midas.dll Q. 別々のバージョンで作成したデータベースアプリケーションがあります

More information

program7app.ppt

program7app.ppt プログラム理論と言語第 7 回 ポインタと配列, 高階関数, まとめ 有村博紀 吉岡真治 公開スライド PDF( 情報知識ネットワーク研 HP/ 授業 ) http://www-ikn.ist.hokudai.ac.jp/~arim/pub/proriron/ 本スライドは,2015 北海道大学吉岡真治 プログラム理論と言語, に基づいて, 現著者の承諾のもとに, 改訂者 ( 有村 ) が加筆修正しています.

More information

01-introduction.ppt

01-introduction.ppt オペレーティングシステム ~ イントロダクション ~ 山田浩史 hiroshiy @ cc.tuat.ac.jp 2015/04/10 オペレーティングシステム 担当 : 山田浩史 ( やまだひろし ) mail: hiroshiy @ cc.tuat.ac.jp 質問等ありましたら気軽にメールをしてください 専門分野 オペレーティングシステムや仮想マシンモニタといった システムソフトウェア と呼ばれる分野

More information

gengo1-11

gengo1-11 関数の再帰定義 自然数 n の階乗 n! を計算する関数を定義してみる 引数は整数 返却値も整数 n! = 1*2*3*... * (n 1)*n である ただし 0! = 1 とする int factorial(int n) int i, tmp=1; if( n>0 ) for(i=1; i

More information

プログラミング基礎

プログラミング基礎 C プログラミング Ⅰ 授業ガイダンス C 言語の概要プログラム作成 実行方法 授業内容について 授業目的 C 言語によるプログラミングの基礎を学ぶこと 学習内容 C 言語の基礎的な文法 入出力, 変数, 演算, 条件分岐, 繰り返し, 配列,( 関数 ) C 言語による簡単な計算処理プログラムの開発 到達目標 C 言語の基礎的な文法を理解する 簡単な計算処理プログラムを作成できるようにする 授業ガイダンス

More information

Microsoft PowerPoint - CproNt02.ppt [互換モード]

Microsoft PowerPoint - CproNt02.ppt [互換モード] 第 2 章 C プログラムの書き方 CPro:02-01 概要 C プログラムの構成要素は関数 ( プログラム = 関数の集まり ) 関数は, ヘッダと本体からなる 使用する関数は, プログラムの先頭 ( 厳密には, 使用場所より前 ) で型宣言 ( プロトタイプ宣言 ) する 関数は仮引数を用いることができる ( なくてもよい ) 関数には戻り値がある ( なくてもよい void 型 ) コメント

More information

HPC143

HPC143 研究背景 GPUクラスタ 高性能 高いエネルギー効率 低価格 様々なHPCアプリケーションで用いられている TCA (Tightly Coupled Accelerators) 密結合並列演算加速機構 筑波大学HA-PACSクラスタ アクセラレータ GPU 間の直接通信 低レイテンシ 今後のHPCアプリは強スケーリングも重要 TCAとアクセラレータを搭載したシステムに おけるプログラミングモデル 例

More information

Taro-リストⅠ(公開版).jtd

Taro-リストⅠ(公開版).jtd 0. 目次 1. 再帰的なデータ構造によるリストの表現 1. 1 リストの作成と表示 1. 1. 1 リストの先頭に追加する方法 1. 1. 2 リストの末尾に追加する方法 1. 1. 3 昇順を保存してリストに追加する方法 1. 2 問題 問題 1 問題 2-1 - 1. 再帰的なデータ構造によるリストの表現 リストは データの一部に次のデータの記憶場所を示す情報 ( ポインタという ) を持つ構造をいう

More information

02: 変数と標準入出力

02: 変数と標準入出力 C プログラミング入門 基幹 7 ( 水 5) 12: コマンドライン引数 Linux にログインし 以下の講義ページを開いておくこと http://www-it.sci.waseda.ac.jp/ teachers/w483692/cpr1/ 2016-06-29 1 まとめ : ポインタを使った処理 内容呼び出し元の変数を書き換える文字列を渡す 配列を渡すファイルポインタ複数の値を返す大きな領域を確保する

More information

講習No.12

講習No.12 前回までの関数のまとめ 関数は main() 関数または他の関数から呼び出されて実行される. 関数を呼び出す側の実引数の値が関数内の仮引数 ( 変数 ) にコピーされる. 関数内で定義した変数は, 関数の外からは用いることができない ( ローカル変数 ). 一般に関数内で仮引数を変化しても, 呼び出し側の変数は変化しない ( 値渡し ). 関数内で求めた値は return 文によって関数値として呼び出し側に戻される.

More information

Microsoft Word - Training10_プリプロセッサ.docx

Microsoft Word - Training10_プリプロセッサ.docx Training 10 プリプロセッサ 株式会社イーシーエス出版事業推進委員会 1 Lesson1 マクロ置換 Point マクロ置換を理解しよう!! マクロ置換の機能により 文字列の置き換えをすることが出来ます プログラムの可読性と保守性 ( メンテナンス性 ) を高めることができるため よく用いられます マクロ置換で値を定義しておけば マクロの値を変更するだけで 同じマクロを使用したすべての箇所が変更ができるので便利です

More information

第1回 プログラミング演習3 センサーアプリケーション

第1回 プログラミング演習3 センサーアプリケーション C プログラミング - ポインタなんて恐くない! - 藤田悟 fujita_s@hosei.ac.jp 目標 C 言語プログラムとメモリ ポインタの関係を深く理解する C 言語プログラムは メモリを素のまま利用できます これが原因のエラーが多く発生します メモリマップをよく頭にいれて ポインタの動きを理解できれば C 言語もこわくありません 1. ポインタ入門編 ディレクトリの作成と移動 mkdir

More information

Prog1_6th

Prog1_6th 2019 年 10 月 31 日 ( 木 ) 実施配列同種のデータ型を有する複数のデータ ( 要素 ) を番号付けして, ひとまとまりの対象として扱うものを配列と呼ぶ 要素 point[0] point[1] point[2] point[3] point[4] 配列 配列の取り扱いに関して, 次のような特徴がある 1. プログラム中で用いる配列変数 ( 配列の本体を参照する参照型の変数 ) は必ず宣言しておく

More information

Microsoft PowerPoint - 第3回目.ppt [互換モード]

Microsoft PowerPoint - 第3回目.ppt [互換モード] 第 3 回プログラミング応用 目的ファイル入出力 1. ファイルの概念 2. ファイルの読み込み 3. ファイルの書き込み CPU 演算 判断 ファイルの概念 内部記憶装置 OS 機械語プログラム 入力装置 キーボード 出力装置 ディスプレイ ファイル 外部記憶装置ハードディスク CD-ROM CPU が外部とデータをやり取りするための媒介 printf 関数や scanf 関数でもうすでにファイルのやり取りの基本は学んでいる

More information

VXPRO R1400® ご提案資料

VXPRO R1400® ご提案資料 Intel Core i7 プロセッサ 920 Preliminary Performance Report ノード性能評価 ノード性能の評価 NAS Parallel Benchmark Class B OpenMP 版での性能評価 実行スレッド数を 4 で固定 ( デュアルソケットでは各プロセッサに 2 スレッド ) 全て 2.66GHz のコアとなるため コアあたりのピーク性能は同じ 評価システム

More information

/*Source.cpp*/ #include<stdio.h> //printf はここでインクルードして初めて使えるようになる // ここで関数 average を定義 3 つの整数の平均値を返す double 型の関数です double average(int a,int b,int c){

/*Source.cpp*/ #include<stdio.h> //printf はここでインクルードして初めて使えるようになる // ここで関数 average を定義 3 つの整数の平均値を返す double 型の関数です double average(int a,int b,int c){ ソフトゼミ A 第 6 回 関数 プログラムは関数の組み合わせでできています 今までのゼミAでも printf や scanf など様々な関数を使ってきましたが なんと関数は自分で作ることもできるのです!! 今日は自作関数を中心に扱っていきます ゲーム制作でも自作関数は避けては通れないので頑張りましょう そもそもまず 関数とは 基本的には 受け取った値に関数によって定められた操作をして その結果の値を返す

More information

演習課題No12

演習課題No12 演習課題 No.12 ( 課題は 3 題ある ) 課題 12-1 時間内提出 従来の C 言語には複素数を直接扱うデータ型はないので (*), 構造体で複素数 ( 英語で complex) を表すことにする. 複素数を表す構造体を以下のように定義する. struct complex float r; // 実部 ( 英語で real) float i; // 虚部 ( 英語で imaginary)

More information

概要 プログラミング論 変数のスコープ, 記憶クラス. メモリ動的確保. 変数のスコープ 重要. おそらく簡単. 記憶クラス 自動変数 (auto) と静的変数 (static). スコープほどではないが重要.

概要 プログラミング論 変数のスコープ, 記憶クラス. メモリ動的確保. 変数のスコープ 重要. おそらく簡単. 記憶クラス 自動変数 (auto) と静的変数 (static). スコープほどではないが重要. 概要 プログラミング論 変数のスコープ, 記憶クラス. メモリ動的確保. 変数のスコープ 重要. おそらく簡単. 記憶クラス 自動変数 (auto) と静的変数 (static). スコープほどではないが重要. http://www.ns.kogakuin.ac.jp/~ct13140/progc/ C-2 ブロック 変数のスコープ C 言語では, から をブロックという. for( ) if( )

More information

openmp1_Yaguchi_version_170530

openmp1_Yaguchi_version_170530 並列計算とは /OpenMP の初歩 (1) 今 の内容 なぜ並列計算が必要か? スーパーコンピュータの性能動向 1ExaFLOPS 次世代スハ コン 京 1PFLOPS 性能 1TFLOPS 1GFLOPS スカラー機ベクトル機ベクトル並列機並列機 X-MP ncube2 CRAY-1 S-810 SR8000 VPP500 CM-5 ASCI-5 ASCI-4 S3800 T3E-900 SR2201

More information

Microsoft PowerPoint ppt

Microsoft PowerPoint ppt 基礎演習 3 C 言語の基礎 (5) 第 05 回 (20 年 07 月 07 日 ) メモリとポインタの概念 ビットとバイト 計算機内部では データは2 進数で保存している 計算機は メモリにデータを蓄えている bit 1bit 0 もしくは 1 のどちらかを保存 byte 1byte 1bitが8つ集まっている byte が メモリの基本単位として使用される メモリとアドレス メモリは 1byte

More information

02: 変数と標準入出力

02: 変数と標準入出力 C プログラミング入門 基幹 2 ( 月 4) 09: ポインタ 文字列 Linux にログインし 以下の講義ページを開いておくこと http://www-it.sci.waseda.ac.jp/ teachers/w483692/cpr1/ 2014-06-09 1 関数できなかったこと 配列を引数として渡す, 戻り値として返す 文字列を扱う 呼び出し元の変数を直接書き換える 例 : 2 つの変数の値を入れ替える関数

More information

02: 変数と標準入出力

02: 変数と標準入出力 C プログラミング入門 基幹 7 ( 水 5) 09: ポインタ 文字列 Linux にログインし 以下の講義ページを開いておくこと http://www-it.sci.waseda.ac.jp/ teachers/w483692/cpr1/ 2016-06-08 1 関数できなかったこと 配列を引数として渡す, 戻り値として返す 文字列を扱う 呼び出し元の変数を直接書き換える 例 : 2 つの変数の値を入れ替える関数

More information

enshu5_6.key

enshu5_6.key 情報知能工学演習V (前半第6週) 政田洋平 システム情報学研究科計算科学専攻 TA : 菅 新 菅沼智史 水曜 新行紗弓 馬淵隼 木曜 演習 V( 前半 ) の内容 第 1 週 : 高性能計算 (High Performance Computing = HPC) 向けプログラミングの基礎 第 2 週 : シミュレーションの基礎 第 3 週 : 波の移流方程式のシミュレーション 第 4,5 週 :

More information

char int float double の変数型はそれぞれ 文字あるいは小さな整数 整数 実数 より精度の高い ( 数値のより大きい より小さい ) 実数 を扱う時に用いる 備考 : 基本型の説明に示した 浮動小数点 とは数値を指数表現で表す方法である 例えば は指数表現で 3 書く

char int float double の変数型はそれぞれ 文字あるいは小さな整数 整数 実数 より精度の高い ( 数値のより大きい より小さい ) 実数 を扱う時に用いる 備考 : 基本型の説明に示した 浮動小数点 とは数値を指数表現で表す方法である 例えば は指数表現で 3 書く 変数 入出力 演算子ここまでに C 言語プログラミングの様子を知ってもらうため printf 文 変数 scanf 文 if 文を使った簡単なプログラムを紹介した 今回は変数の詳細について習い それに併せて使い方が増える入出力処理の方法を習う また 演算子についての復習と供に新しい演算子を紹介する 変数の宣言プログラムでデータを取り扱う場合には対象となるデータを保存する必要がでてくる このデータを保存する場所のことを

More information

Microsoft PowerPoint - 09.pptx

Microsoft PowerPoint - 09.pptx 情報処理 Ⅱ 第 9 回 2014 年 12 月 22 日 ( 月 ) 関数とは なぜ関数 関数の分類 自作関数 : 自分で定義する. ユーザ関数 ユーザ定義関数 などともいう. 本日のテーマ ライブラリ関数 : 出来合いのもの.printf など. なぜ関数を定義するのか? 処理を共通化 ( 一般化 ) する プログラムの見通しをよくする 機能分割 ( モジュール化, 再利用 ) 責任 ( あるいは不具合の発生源

More information

02: 変数と標準入出力

02: 変数と標準入出力 C プログラミング入門 基幹 7 ( 水 5) 13: 構造体 Linux にログインし 以下の講義ページを開いておくこと http://www-it.sci.waseda.ac.jp/ teachers/w483692/cpr1/ 2016-07-06 1 例題 : 多角形の面積 n = 5 (5 角形 ) の例 n 1 n 1 1 p 1 T 0 S = i=0 p 0 T i = i=0 2

More information

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード] 第 3 回 Java 基本技術講義 クラス構造と生成 33 クラスの概念 前回の基本文法でも少し出てきたが, オブジェクト指向プログラミングは という概念をうまく活用した手法である. C 言語で言う関数に似ている オブジェクト指向プログラミングはこれら状態と振る舞いを持つオブジェクトの概念をソフトウェア開発の中に適用し 様々な機能を実現する クラス= = いろんなプログラムで使いまわせる 34 クラスの概念

More information

GPU 画像 動画処理用ハードウェア 低性能なプロセッサがたくさん詰まっている ピーク性能が非常に高い GPUを数値計算に用いるのがGPGPU Graphics Processing Unit General Purpose GPU TSUBAME2.0: GPUスパコン 本演習ではNVIDIA社の

GPU 画像 動画処理用ハードウェア 低性能なプロセッサがたくさん詰まっている ピーク性能が非常に高い GPUを数値計算に用いるのがGPGPU Graphics Processing Unit General Purpose GPU TSUBAME2.0: GPUスパコン 本演習ではNVIDIA社の 演習II (連続系アルゴリズム) 第2回: GPGPU 須田研究室 M1 本谷 徹 motoya@is.s.u-tokyo.ac.jp 2012/10/19 GPU 画像 動画処理用ハードウェア 低性能なプロセッサがたくさん詰まっている ピーク性能が非常に高い GPUを数値計算に用いるのがGPGPU Graphics Processing Unit General Purpose GPU TSUBAME2.0:

More information

C のコード例 (Z80 と同機能 ) int main(void) { int i,sum=0; for (i=1; i<=10; i++) sum=sum + i; printf ("sum=%d n",sum); 2

C のコード例 (Z80 と同機能 ) int main(void) { int i,sum=0; for (i=1; i<=10; i++) sum=sum + i; printf (sum=%d n,sum); 2 アセンブラ (Z80) の例 ORG 100H LD B,10 SUB A LOOP: ADD A,B DEC B JR NZ,LOOP LD (SUM),A HALT ORG 200H SUM: DEFS 1 END 1 C のコード例 (Z80 と同機能 ) int main(void) { int i,sum=0; for (i=1; i

More information

02: 変数と標準入出力

02: 変数と標準入出力 C プログラミング入門 総機 1 ( 月 1) 13: 構造体 Linux にログインし 以下の講義ページを開いておくこと http://www-it.sci.waseda.ac.jp/ teachers/w483692/cpr1/ 2015-07-06 1 例題 : 多角形の面積 n = 5 (5 角形 ) の例 n 1 n 1 p 1 S = T i = 1 2 p i p i+1 i=0 i=0

More information

8 / 0 1 i++ i 1 i-- i C !!! C 2

8 / 0 1 i++ i 1 i-- i C !!! C 2 C 2006 5 2 printf() 1 [1] 5 8 C 5 ( ) 6 (auto) (static) 7 (=) 1 8 / 0 1 i++ i 1 i-- i 1 2 2.1 C 4 5 3 13!!! C 2 2.2 C ( ) 4 1 HTML はじめ mkdir work 作業用ディレクトリーの作成 emacs hoge.c& エディターによりソースプログラム作成 gcc -o fuga

More information

OpenMPプログラミング

OpenMPプログラミング OpenMP 基礎 岩下武史 ( 学術情報メディアセンター ) 1 2013/9/13 並列処理とは 逐次処理 CPU1 並列処理 CPU1 CPU2 CPU3 CPU4 処理 1 処理 1 処理 2 処理 3 処理 4 処理 2 処理 3 処理 4 時間 2 2 種類の並列処理方法 プロセス並列 スレッド並列 並列プログラム 並列プログラム プロセス プロセス 0 プロセス 1 プロセス間通信 スレッド

More information

本文ALL.indd

本文ALL.indd Intel Xeon プロセッサにおける Cache Coherency 時間の性能測定方法河辺峻田口成美古谷英祐 Intel Xeon プロセッサにおける Cache Coherency 時間の性能測定方法 Performance Measurement Method of Cache Coherency Effects on an Intel Xeon Processor System 河辺峻田口成美古谷英祐

More information

講習No.1

講習No.1 プログラムはどこに保存され, どこで実行されるのか? 復習 ハードディスク キーボード Central Processing Unit 例えば i7, ARM, Cortex-A17 ディスプレイ 例えば 4G バイト メモリ プログラムは, ワープロ文章などと同様, ハードディスクなどにファイルとして保存されている. プログラムは, メモリ上に呼び出されて ( ロード ) 実行される. プログラムの作成

More information

Microsoft PowerPoint - C4(反復for).ppt

Microsoft PowerPoint - C4(反復for).ppt C 言語プログラミング 繰返し ( for 文と while 文 ) 例題 (10 個のデータの平均を求める ) 手順 入力データをx1,x2,,x10 として, (x1+x2+x3+x4+x5+x6+x7+x8+x9+x10)/10 を計算する データ数が,1000 個,10000 個, となったらどうする? データ数個分の 変数の宣言, scanf 関数の呼出し, 加算式の記述 が必要 1 総和を求めること

More information

生物情報実験法 (オンライン, 4/20)

生物情報実験法 (オンライン, 4/20) 生物情報実験法 (7/23) 笠原雅弘 (mkasa@cb.k.u-tokyo.ac.jp) Table of Contents スレッドの使い方 OpenMP プログラミング Deadline The deadline is Aug 5 23:59 Your e-mail must have reached my e-mail box at the deadline time. It may take

More information

ポインタ変数

ポインタ変数 プログラミング及び実習 5 馬青 1 文字処理 数値処理 : 整数 浮動小数点数 単一の文字は と ( シングルクォーテーション ) で囲んで表現される 文字のデータ型は char または int である int を用いたほうが ライブラリの関数の引数の型と一致する 以下は全部 int の使用に統一する 従って int ch; で文字変数を宣言しておくと ch= A ; のように ch に文字 A

More information

02: 変数と標準入出力

02: 変数と標準入出力 C プログラミング入門 総機 1 ( 月 1) 14: 発展事項 2014-07-13 1 今日の内容 これまでの講義で説明していない事項についていくつか簡単に紹介する 文法 標準入出力ファイル 異常終了 短絡評価 文字定数の型 キャスト 変数の宣言位置 グローバル変数 静的変数 (static) const 変数 プリプロセッサ ディレクティブ マクロ ファイルの読み込み 数学関数のエラーチェック

More information

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション vsmp Foundation スケーラブル SMP システム スケーラブル SMP システム 製品コンセプト 2U サイズの 8 ソケット SMP サーバ コンパクトな筐体に多くのコアとメモリを実装し SMP システムとして利用可能 スイッチなし構成でのシステム構築によりラックスペースを無駄にしない構成 将来的な拡張性を保証 8 ソケット以上への拡張も可能 2 システム構成例 ベースシステム 2U

More information

Microsoft PowerPoint - ca ppt [互換モード]

Microsoft PowerPoint - ca ppt [互換モード] 大阪電気通信大学情報通信工学部光システム工学科 2 年次配当科目 コンピュータアルゴリズム 良いアルゴリズムとは 第 2 講 : 平成 20 年 10 月 10 日 ( 金 ) 4 限 E252 教室 中村嘉隆 ( なかむらよしたか ) 奈良先端科学技術大学院大学助教 y-nakamr@is.naist.jp http://narayama.naist.jp/~y-nakamr/ 第 1 講の復習

More information

Taro-ポインタ変数Ⅰ(公開版).j

Taro-ポインタ変数Ⅰ(公開版).j 0. 目次 1. ポインタ変数と変数 2. ポインタ変数と配列 3. ポインタ変数と構造体 4. ポインタ変数と線形リスト 5. 問題 問題 1 問題 2-1 - 1. ポインタ変数と変数 ポインタ変数には 記憶領域の番地が格納されている 通常の変数にはデータが格納されている 宣言 int *a; float *b; char *c; 意味ポインタ変数 aは 整数型データが保存されている番地を格納している

More information

7 ポインタ (P.61) ポインタを使うと, メモリ上のデータを直接操作することができる. 例えばデータの変更 やコピーなどが簡単にできる. また処理が高速になる. 7.1 ポインタの概念 変数を次のように宣言すると, int num; メモリにその領域が確保される. 仮にその開始のアドレスを 1

7 ポインタ (P.61) ポインタを使うと, メモリ上のデータを直接操作することができる. 例えばデータの変更 やコピーなどが簡単にできる. また処理が高速になる. 7.1 ポインタの概念 変数を次のように宣言すると, int num; メモリにその領域が確保される. 仮にその開始のアドレスを 1 7 ポインタ (P.61) ポインタを使うと, メモリ上のデータを直接操作することができる. 例えばデータの変更 やコピーなどが簡単にできる. また処理が高速になる. 7.1 ポインタの概念 変数を次のように宣言すると, int num; メモリにその領域が確保される. 仮にその開始のアドレスを 10001 番地とすると, そこから int 型のサイズ, つまり 4 バイト分の領域が確保される.1

More information

10-vm1.ppt

10-vm1.ppt オペレーティングシステム ~ 仮想記憶 (1) ~ 山田浩史 hiroshiy @ cc.tuat.ac.jp 2015/06/19 OS の目的 裸のコンピュータを抽象化 (abstraction) し より使いやすく安全なコンピュータとして見せること OS はハードウェアを制御し アプリケーションの効率的な動作や容易な開発を支援する OS がないと メモリをアプリケーション自身が管理しなければならない

More information

slide5.pptx

slide5.pptx ソフトウェア工学入門 第 5 回コマンド作成 1 head コマンド作成 1 早速ですが 次のプログラムを head.c という名前で作成してください #include #include static void do_head(file *f, long nlines); int main(int argc, char *argv[]) { if (argc!=

More information

2. OpenMP OpenMP OpenMP OpenMP #pragma#pragma omp #pragma omp parallel #pragma omp single #pragma omp master #pragma omp for #pragma omp critica

2. OpenMP OpenMP OpenMP OpenMP #pragma#pragma omp #pragma omp parallel #pragma omp single #pragma omp master #pragma omp for #pragma omp critica C OpenMP 1. OpenMP OpenMP Architecture Review BoardARB OpenMP OpenMP OpenMP OpenMP OpenMP Version 2.0 Version 2.0 OpenMP Fortran C/C++ C C++ 1997 10 OpenMP Fortran API 1.0 1998 10 OpenMP C/C++ API 1.0

More information

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdio.h> #define InFile "data.txt" #define OutFile "sorted.txt" #def

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdio.h> #define InFile data.txt #define OutFile sorted.txt #def C プログラミング演習 1( 再 ) 6 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ 関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include #define InFile "data.txt" #define OutFile "sorted.txt"

More information

Prog2_9th

Prog2_9th 2013 年 11 月 21 日 ( 木 ) 実施例外処理 Java 言語では, 作成したプログラムを実行する際に, 記述した処理が想定しない事態によって実行できなくなる場合を例外と呼び, その例外への対処, 即ち例外処理が求められる これまでの教材に登場した例外の中で,IOException はコンパイラがチェックするため, 例外処理を必ず記述しなければコンパイルが出来ないものであるのに対して,ArithmeticException

More information

02: 変数と標準入出力

02: 変数と標準入出力 C プログラミング入門 基幹 7 ( 水 5) 09: ポインタ 文字列 Linux にログインし 以下の講義ページを開いておくこと http://www-it.sci.waseda.ac.jp/teachers/w 483692/CPR/ 207-06-4 関数できなかったこと 2 配列を引数として渡す, 戻り値として返す 文字列を扱う 呼び出し元の変数を直接書き換える 例 : 2 つの変数の値を入れ替える関数

More information

講習No.9

講習No.9 日本語は通常 2 バイトの文字コード.JIS コード, シフト JIS コード, Unicode (UTF-8) 等の様々な文字コードがある. アスキーコード表 (ASCII code) アスキーコード ( 値 ) 漢字変換無しでキーボードから直接入力できる半角文字 32 48 0 64 @ 80 P 96 ` 112 p 33! 49 1 65 A 81 Q 97 a 113 q 34 " 50

More information

プログラミング基礎

プログラミング基礎 C プログラミング Ⅱ 演習 2-1(a) BMI による判定 文字列, 身長 height(double 型 ), 体重 weight (double 型 ) をメンバとする構造体 Data を定義し, それぞれのメンバの値をキーボードから入力した後, BMI を計算するプログラムを作成しなさい BMI の計算は関数化すること ( ) [ ] [ ] [ ] BMI = 体重 kg 身長 m 身長

More information