SlideShare a Scribd company logo
1 of 53
Download to read offline
第15回 CPUとGPUの協調
長岡技術科学大学 電気電子情報工学専攻 出川智啓
今回の内容
2015/07/23先端GPGPUシミュレーション工学特論2
 並列処理と並行処理
 ストリーム
 複数ストリームを用いたベクトル和の計算
 CPUとGPUを用いたベクトル和の計算
並列処理と並行処理
2015/07/23先端GPGPUシミュレーション工学特論3
 並列処理(Parallel Processing)
 一つの処理を複数の処理に分割
 協調しながら複数の処理を実行
 プログラムを高速化するために行われる
 並行処理(Concurrent Processing)
 複数の処理を実行
 複数の処理は必ずしも協調していない
 利便性の向上のために行われる
 OSが複数のプログラムを実行する等
CUDAプログラムの実行
 実行時の流れ(CPU視点)
 利用するGPUの初期化やデータの転送などを実行
 GPUで実行する関数を呼び出し
 GPUから結果を取得
初期化の指示
初期化
カーネルの実行指示
カーネルを実行
結果の取得
実行結果をコピー
time
CPUとGPUは非同期
CPUは別の処理を実行可能
2015/07/23先端GPGPUシミュレーション工学特論4
必要なデータのコピー
メモリに書込
GPUとCPUの並行実行
2015/07/23先端GPGPUシミュレーション工学特論5
 GPUのみの処理
float *a = (float *)malloc(NBytes);
float *dev_a;
cudaMalloc((void **)&dev_a, NBytes);
cudaMemcpy(dev_a, a, NBytes, cudaMemcpyHostToDevice);
kernel<<<NB, NT>>>(dev_a);
cudaMemcpy(a, dev_a, NBytes, cudaMemcpyDeviceToHost);
aを転送(H2D) kernel dev_aを転送(D2H)GPU
待機 待機CPU
cudaMemcpy実行 カーネル起動 cudaMemcpy実行
GPUとは同期せず(カーネルの終了を待たず),
直ちに次の処理を実行
GPUとCPUの並行実行
2015/07/23先端GPGPUシミュレーション工学特論6
 GPUとCPUの非同期処理
float *a = (float *)malloc(NBytes), *dev_a;
cudaMalloc((void **)&dev_a, NBytes);
cudaMemcpy(dev_a, a, NBytes, cudaMemcpyHostToDevice);
kernel<<<NB, NT>>>(dev_a); 
do_something(a);
cudaMemcpy(a, dev_a, NBytes, cudaMemcpyDeviceToHost);
CPUとGPUは非同期で処理を実行
aを転送(H2D) kernel 待機 dev_aを転送(D2H)GPU
待機 do_something() 待機CPU
cudaMemcpy実行 カーネル起動 cudaMemcpy実行
GPUとCPUの並行実行
2015/07/23先端GPGPUシミュレーション工学特論7
 GPUとCPUが非同期で行う処理とは
 cudaMemcpy
 同期通信(synchronous)
 同期が完了するまでCPUとGPUが他の処理を実行しない
 ブロッキング(blocking)型とも呼ばれる
 カーネル実行
 非同期で実行(asynchronous)
 カーネルを実行した直後にCPUが他の処理を実行可能
GPUの並行実行(要望)
2015/07/23先端GPGPUシミュレーション工学特論8
 通信(データ転送)を同時に行いたい
 通信(データ転送)している間に計算を実行したい
 負荷の軽い計算を複数同時に実行したい
float *a, *b, *dev_a, *dev_b;
a = (float *)malloc(NBytes);
b = (float *)malloc(NBytes);
cudaMalloc((void **)&dev_a, NBytes);
cudaMalloc((void **)&dev_b, NBytes);
cudaMemcpy(dev_a, a, NBytes, cudaMemcpyHostToDevice);
cudaMemcpy(dev_b, b, NBytes, cudaMemcpyHostToDevice);
kernel1<<<1, NT>>>(dev_a);
kernel2<<<1, NT>>>(dev_b);
cudaMemcpy(a, dev_a, NBytes, cudaMemcpyDeviceToHost);
cudaMemcpy(b, dev_b, NBytes, cudaMemcpyDeviceToHost);
転送が終わると直ち
にカーネル実行
負荷が軽いカーネル
は同時に実行
カーネルが終わると
直ちに転送
GPUの並行実行(要望)
2015/07/23先端GPGPUシミュレーション工学特論9
cudaMemcpy(dev_a, a, NBytes, cudaMemcpyHostToDevice);
cudaMemcpy(dev_b, b, NBytes, cudaMemcpyHostToDevice);
kernel1<<<1, NT>>>(dev_a);
kernel2<<<1, NT>>>(dev_b);
cudaMemcpy(a, dev_a, NBytes, cudaMemcpyDeviceToHost);
cudaMemcpy(b, dev_b, NBytes, cudaMemcpyDeviceToHost);
転送が終わると直ち
にカーネル実行
負荷が軽いカーネル
は同時に実行
カーネルが終わると
直ちに転送
aを転送(H2D) kernel1 dev_aを転送(D2H)
bを転送(H2D) kernel2 dev_bを転送(D2H)
転送の
並行実行
転送と
カーネ
ルの並
行実行
カーネルの
並行実行
転送とカーネル
の並行実行
転送の
並行実行
GPUの並行実行(要望)
2015/07/23先端GPGPUシミュレーション工学特論10
cudaMemcpy(dev_a, a, NBytes, cudaMemcpyHostToDevice);
cudaMemcpy(dev_b, b, NBytes, cudaMemcpyHostToDevice);
kernel1<<<1, NT>>>(dev_a);
kernel2<<<1, NT>>>(dev_b);
cudaMemcpy(a, dev_a, NBytes, cudaMemcpyDeviceToHost);
cudaMemcpy(b, dev_b, NBytes, cudaMemcpyDeviceToHost);
転送が終わると直ち
にカーネル実行
負荷が軽いカーネル
は同時に実行
カーネルが終わると
直ちに転送
aを転送(H2D) kernel1 dev_aを転送(D2H)
bを転送(H2D) kernel2 dev_bを転送(D2H)
転送の
並行実行
転送と
カーネ
ルの並
行実行
カーネルの
並行実行
転送とカーネル
の並行実行
転送の
並行実行
転送の方向が異
なる場合は可能
転送の方向が異
なる場合は可能
Concurrent Kernel Execution
2015/07/23先端GPGPUシミュレーション工学特論11
 GPUが並行に処理を実行可能かの確認
 cudaGetDeviceProperties()のメンバdeviceOverlap
を確認
 1なら並行実行可能
int dev = 0;
cudaDeviceProp deviceProp;
cudaGetDeviceProperties(&deviceProp, dev);
if(deviceProp.deviceOverlap == 1)
printf("Device %d: ¥"%s¥" supports concurrent kernel execution¥n",
dev, deviceProp.name);
concurrent.cu
GPUの並行実行
2015/07/23先端GPGPUシミュレーション工学特論12
 データ通信とカーネル実行を並行に実行可能
 データ通信と並行に実行できるカーネルは一つ
 CPUからGPUへの転送,GPUからCPUへの転送,カーネル実
行を並行に実行可能
 Compute Capability 2.0以上のGPU
 pgaccelinfoのDevice Revision Numberと同じ
 複数のカーネルを並行に実行
 並行実行可能なカーネルの数
 32 Compute Capability 3.5以上
 16 Compute Capability 2.0以上3.5未満
 並行実行するカーネルが資源を利用できることが条件
ストリーム
2015/07/23先端GPGPUシミュレーション工学特論13
 GPUで実行される処理の流れ
 同じストリームに属する処理は,必ず命令発行され
た順に実行される
 異なるストリームに属する処理は並行に実行できる
 異なるストリームに属する処理間に依存性がないと仮定
 ストリームを複数作ることで処理を並行に実行
標準のストリーム(ストリーム0)
2015/07/23先端GPGPUシミュレーション工学特論14
 ストリームを指定しない場合はストリーム0に所属
 ストリーム0は他の処理とは同時に実行されない
 ストリーム0はCPUと同期して実行
 例外はカーネル実行,明示的な非同期通信等
 並行に実行するためには,0でない複数のストリーム
に所属させる必要がある
float *a, *b, *dev_a, *dev_b;
cudaStream_t stream1, stream2;
cudaStreamCreate(&stream1);
cudaStreamCreate(&stream2);
cudaMalloc((void **)&dev_a, NBytes);
cudaMalloc((void **)&dev_b, NBytes);
cudaHostAlloc((void **)&a, NBytes, cudaHostAllocDefault);
cudaHostAlloc((void **)&b, NBytes, cudaHostAllocDefault);
cudaMemcpyAsync(dev_a, a, Nbytes, cudaMemcpyHostToDevice, stream1);
cudaMemcpyAsync(dev_b, b, Nbytes, cudaMemcpyHostToDevice, stream2);
kernel1<<<1, NT, 0, stream1>>>(dev_a);
kernel2<<<1, NT, 0, stream2>>>(dev_b);
cudaMemcpyAsync(a, dev_a, Nbytes, cudaMemcpyDeviceToHost, stream1);
cudaMemcpyAsync(a, dev_a, Nbytes, cudaMemcpyDeviceToHost, stream2);
cudaDeviceSynchronize();
ストリームを用いた並行実行
2015/07/23先端GPGPUシミュレーション工学特論15
ストリームを用いた並行実行
2015/07/23先端GPGPUシミュレーション工学特論16
 ストリームの作成(具体的に番号を付けるわけではない)
 cudaStreamCreate(cudaStream_t *);
 ストリームの破棄
 cudaStreamDestroy(cudaStream_t);
cudaStream_t stream1, stream2,stream[10];
cudaStreamCreate(&stream1); //個別の変数でストリームを管理することが可能
cudaStreamCreate(&stream2); //
for(int i=0;i<10;i++)
cudaStreamCreate(&stream[i]);//配列でストリームを管理することも可能
cudaStreamDestroy(stream1); 
cudaStreamDestroy(stream2); 
for(int i=0;i<10;i++)
cudaStreamDestroy(stream[i]);
ストリームを用いた並行実行
2015/07/23先端GPGPUシミュレーション工学特論17
 cudaMemcpyAsync
 非同期転送(asynchronous)
 5番目の引数としてストリームを指定
 CPUのメモリには必ずページロックメモリを指定
 cudaHostAlloc()もしくはcudaMallocHost()で確保
 カーネル実行
 <<<>>>内の4番目にストリームを指定
 (1)ブロック数 (2)1ブロックあたりのスレッド数
(3)共有メモリサイズ (4)ストリーム
 共有メモリのサイズを指定しない場合は0を記述
並行実行の同期
2015/07/23先端GPGPUシミュレーション工学特論18
 cudaDeviceSynchronize()
 GPUで実行している全ての処理が完了するまで待機
 cudaStreamSynchronize(ストリーム)
 引数で指定したストリームに属する命令が完了するまで待機
…
cudaMemcpyAsync(a, dev_a, Nbytes, cudaMemcpyDeviceToHost, stream1);
cudaMemcpyAsync(b, dev_b, Nbytes, cudaMemcpyDeviceToHost, stream2);
cudaDeviceSynchronize(); //dev_a,dev_b両方の転送が終わるまで待機
…
cudaMemcpyAsync(a, dev_a, Nbytes, cudaMemcpyDeviceToHost, stream1);
cudaMemcpyAsync(b, dev_b, Nbytes, cudaMemcpyDeviceToHost, stream2);
cudaStreamSynchronize(stream1); //dev_aの転送が終わると次の処理へ移行
ベクトル和C=A+Bの並行実行
2015/07/23先端GPGPUシミュレーション工学特論19
 並行実行の方針
 複数のストリームを作成
 配列のまとまったサイズを異なるストリームに所属
 A, Bの初期化はCPUで実行し,GPUへ転送
 A, Bの転送が終わったストリームから足し算を実行し,
CPUへCを転送
ベクトル和C=A+Bの並行実行
2015/07/23先端GPGPUシミュレーション工学特論20
 同期実行
 並行実行
 処理をオーバーラップできれば若干高速化
Aを転送(H2D) Bを転送(H2D) add dev_Cを転送(D2H)
A(H2D) B(H2D) add dev_C(D2H)
A(H2D) B(H2D) add dev_C(D2H)
A(H2D) B(H2D) add dev_C(D2H)
Stream 0
Stream 1
Stream 2
Stream 3 高速化
実行開始 処理時間
#include<stdio.h>
#include<stdlib.h>
#include<omp.h>
#define N (1024*1024*8)
#define Nbytes (N*sizeof(float))
#define NT 256
#define NB (N/NT)
//Streamの数=並行実行数
#define Stream 4
//カーネルは変更なし
__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;
}
//カーネルは変更なし
__global__ void add
(float *a, float *b, float *c){
int i = blockIdx.x*blockDim.x
+ threadIdx.x;
c[i] = a[i] + b[i];
}
ベクトル和(ストリームの利用)
2015/07/23先端GPGPUシミュレーション工学特論21
vectoradd_stream.cu
int main(){
float *a,*b,*c;
int stm;
cudaStream_t stream[Stream];
//ページロックホストメモリを確保
float *host_a, *host_b, *host_c;
cudaHostAlloc((void **)&host_c,
Nbytes, cudaHostAllocDefault);
cudaHostAlloc((void **)&host_a,
Nbytes, cudaHostAllocDefault);
cudaHostAlloc((void **)&host_b,
Nbytes, cudaHostAllocDefault);
for(int i=0;i<N;i++){
host_a[i] = 1.0f;
host_b[i] = 2.0f;
host_c[i] = 0;
}
for(stm=0;stm<Stream;stm++){
cudaStreamCreate(&stream[stm]);
}
cudaMalloc( (void **)&a, Nbytes);
cudaMalloc( (void **)&b, Nbytes);
cudaMalloc( (void **)&c, Nbytes);
ベクトル和(ストリームの利用)
2015/07/23先端GPGPUシミュレーション工学特論22
vectoradd_stream.cu
double time_start = omp_get_wtime();
for(stm=0;stm<Stream;stm++){
int idx = stm*N/Stream;
cudaMemcpyAsync(&a[idx], &host_a[idx], Nbytes/Stream, cudaMemcpyHostToDevice, 
stream[stm]);
cudaMemcpyAsync(&b[idx], &host_b[idx], Nbytes/Stream, cudaMemcpyHostToDevice, 
stream[stm]);
add<<< NB/Stream, NT, 0 ,stream[stm]>>>(&a[idx],&b[idx],&c[idx]);
cudaMemcpyAsync(&host_c[idx], &c[idx], Nbytes/Stream, cudaMemcpyDeviceToHost, 
stream[stm]);
}
cudaDeviceSynchronize();
double time_end = omp_get_wtime();
ベクトル和(ストリームの利用)
2015/07/23先端GPGPUシミュレーション工学特論23
vectoradd_stream.cu
double sum=0;
for(int i=0;i<N;i++)sum+=host_c[i];
printf("%f¥n",sum/N);
printf("elapsed time = %f sec¥n",
time_end‐time_start);
cudaFreeHost(host_a);
cudaFreeHost(host_b);
cudaFreeHost(host_c);
cudaFree(a);
cudaFree(b);
cudaFree(c);
for(stm=0;stm<Stream;stm++){
cudaStreamDestroy(stream[stm]);
}
return 0;
}
ベクトル和(ストリームの利用)
2015/07/23先端GPGPUシミュレーション工学特論24
vectoradd_stream.cu
実行結果
2015/07/23先端GPGPUシミュレーション工学特論25
 配列の要素数 N=223
 1ブロックあたりのスレッド数 256
 OpenMPの関数を用いて実行時間を測定
 コンパイルにはオプション‐Xcompiler ‐fopenmpが必要
ストリーム数 実行時間[ms]
1 17.5
2 15.5
4 14.5
8 14.1
16 14.0
ストリーム数
実行時間[ms]
プロファイラによる確認
2015/07/23先端GPGPUシミュレーション工学特論26
 ストリーム数4
 メモリ転送とベクトル和を4セット実行
# CUDA_PROFILE_LOG_VERSION 2.0
# CUDA_DEVICE 0 Tesla M2050
# TIMESTAMPFACTOR fffff60a9ac44950
timestamp,method,gputime,cputime,occupancy
timestamp=[ 92925.000 ] method=[ memcpyHtoDasync ] gputime=[ 1403.488 ] cputime=[ 16.000 ]
timestamp=[ 92948.000 ] method=[ memcpyHtoDasync ] gputime=[ 1410.880 ] cputime=[ 5.000 ]
timestamp=[ 92977.000 ] method=[ _Z3addPfS_S_ ] gputime=[ 253.472 ] cputime=[ 23.000 ] occupancy=[ 1.000 ]
timestamp=[ 93005.000 ] method=[ memcpyDtoHasync ] gputime=[ 1520.448 ] cputime=[ 6.000 ]
timestamp=[ 93014.000 ] method=[ memcpyHtoDasync ] gputime=[ 1931.936 ] cputime=[ 6.000 ]
timestamp=[ 93021.000 ] method=[ memcpyHtoDasync ] gputime=[ 1414.272 ] cputime=[ 5.000 ]
timestamp=[ 93029.000 ] method=[ _Z3addPfS_S_ ] gputime=[ 253.248 ] cputime=[ 8.000 ] occupancy=[ 1.000 ]
timestamp=[ 93038.000 ] method=[ memcpyDtoHasync ] gputime=[ 1521.216 ] cputime=[ 5.000 ]
timestamp=[ 93045.000 ] method=[ memcpyHtoDasync ] gputime=[ 1935.456 ] cputime=[ 6.000 ]
timestamp=[ 93053.000 ] method=[ memcpyHtoDasync ] gputime=[ 1417.152 ] cputime=[ 6.000 ]
timestamp=[ 93060.000 ] method=[ _Z3addPfS_S_ ] gputime=[ 252.352 ] cputime=[ 7.000 ] occupancy=[ 1.000 ]
timestamp=[ 93068.000 ] method=[ memcpyDtoHasync ] gputime=[ 1566.624 ] cputime=[ 6.000 ]
timestamp=[ 93076.000 ] method=[ memcpyHtoDasync ] gputime=[ 1978.208 ] cputime=[ 6.000 ]
timestamp=[ 93083.000 ] method=[ memcpyHtoDasync ] gputime=[ 1414.528 ] cputime=[ 6.000 ]
timestamp=[ 93090.000 ] method=[ _Z3addPfS_S_ ] gputime=[ 225.568 ] cputime=[ 8.000 ] occupancy=[ 1.000 ]
timestamp=[ 93099.000 ] method=[ memcpyDtoHasync ] gputime=[ 1319.040 ] cputime=[ 6.000 ]
Nsightによる確認
2015/07/23先端GPGPUシミュレーション工学特論27
 ストリーム数8
 カーネル実行と転送(CPUからGPU,GPUからCPU)がオー
バーラップ
CPUとGPUの協調
2015/07/23先端GPGPUシミュレーション工学特論28
 cudaDeviceSynchronize()が呼ばれるまでCPUと
GPUは非同期
 GPUでベクトル和を計算している間,CPUは待機
 処理の一部をCPUが実行する事で高速化が可能
 GPUのカーネル,非同期転送処理を全て呼び終わった後に
CPUでもベクトル和を計算
A(H2D) B(H2D) add dev_C(D2H)
A(H2D) B(H2D) add dev_C(D2H)
転送・カー
ネル呼出 add
Stream 1
Stream 2
CPU
#include<stdio.h>
#include<stdlib.h>
#include<omp.h>
#define N (1024*1024*8)
#define Nbytes (N*sizeof(float))
#define NT 256
#define NB (N/NT)
//Streamの数=並行実行数
#define Stream 4
//CPUのStream分担数
//GPUはStream‐CPU分の数だけ並行処理を実行
#define CPU 1
//カーネルは変更なし
__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;
}
//カーネルは変更なし
__global__ void add
(float *a, float *b, float *c){
int i = blockIdx.x*blockDim.x
+ threadIdx.x;
c[i] = a[i] + b[i];
}
ベクトル和(CPU・GPU協調)
2015/07/23先端GPGPUシミュレーション工学特論29
vectoradd_coop.cu
int main(){
float *a,*b,*c;
int stm;
cudaStream_t stream[Stream];
float *host_a, *host_b, *host_c;
cudaHostAlloc((void **)&host_c,
Nbytes, cudaHostAllocDefault);
cudaHostAlloc((void **)&host_a,
Nbytes, cudaHostAllocDefault);
cudaHostAlloc((void **)&host_b,
Nbytes, cudaHostAllocDefault);
for(int i=0;i<N;i++){
host_a[i] = 1.0f;
host_b[i] = 2.0f;
host_c[i] = 0;
}
for(stm=0;stm<Stream‐CPU;stm++){
cudaStreamCreate(&stream[stm]);
}
cudaMalloc( (void **)&a, Nbytes);
cudaMalloc( (void **)&b, Nbytes);
cudaMalloc( (void **)&c, Nbytes);
ベクトル和(CPU・GPU協調)
2015/07/23先端GPGPUシミュレーション工学特論30
vectoradd_coop.cu
double time_start = omp_get_wtime();
for(stm=0;stm<Stream‐CPU;stm++){
int idx = stm*N/Stream;
cudaMemcpyAsync(&a[idx], &host_a[idx], Nbytes/Stream, cudaMemcpyHostToDevice, 
stream[stm]);
cudaMemcpyAsync(&b[idx], &host_b[idx], Nbytes/Stream, cudaMemcpyHostToDevice, 
stream[stm]);
add<<< NB/Stream, NT, 0 ,stream[stm]>>>(&a[idx],&b[idx],&c[idx]);
cudaMemcpyAsync(&host_c[idx], &c[idx], Nbytes/Stream, cudaMemcpyDeviceToHost, 
stream[stm]);
}
for(int i=(Stream‐CPU)*N/Stream;i<N;i++)
host_c[i] = host_a[i] + host_b[i];
cudaDeviceSynchronize();
double time_end = omp_get_wtime();
ベクトル和(CPU・GPU協調)
2015/07/23先端GPGPUシミュレーション工学特論31
vectoradd_coop.cu
double sum=0;
for(int i=0;i<N;i++)sum+=host_c[i];
printf("%f¥n",sum/N);
printf("elapsed time = %f sec¥n",
time_end‐time_start);
cudaFreeHost(host_a);
cudaFreeHost(host_b);
cudaFreeHost(host_c);
cudaFree(a);
cudaFree(b);
cudaFree(c);
for(stm=0;stm<Stream‐CPU;stm++){
cudaStreamDestroy(stream[stm]);
}
return 0;
}
ベクトル和(CPU・GPU協調)
2015/07/23先端GPGPUシミュレーション工学特論32
vectoradd_coop.cu
実行結果
2015/07/23先端GPGPUシミュレーション工学特論33
 配列の要素数 N=223
 1ブロックあたりのスレッド数 256
 ストリームの数,CPUの負荷割合を変えて計算
 CPU負荷割合=CPUが計算するストリーム数/ストリーム数
 0のとき全てGPUで計算,1のとき全てCPUで計算
 OpenMPの関数を用いて実行時間を測定
 コンパイルにはオプション‐Xcompiler ‐fopenmpが必要
実行結果
2015/07/23先端GPGPUシミュレーション工学特論34
ストリーム
数
CPU
負荷割合
実行時間
[ms]
1
0 (GPU) 17.6
1 (CPU) 36.4
2
0.0 15.5
0.5 18.3
1.0 36.4
4
0.00 14.5
0.25 11.2
0.50 18.3
0.75 27.4
1.00 36.3
ストリーム
数
CPU
負荷割合
実行時間
[ms]
8
0.000 14.1
0.125 12.5
0.250 10.8
0.375 13.8
0.500 18.3
0.625 22.9
0.750 27.4
0.875 31.9
1.000 36.3
実行結果
2015/07/23先端GPGPUシミュレーション工学特論35
ストリーム
数
CPU
負荷割合
実行時間
[ms]
16
0.0000 14.0
0.0625 13.1
0.1250 12.2
0.1875 11.5
0.2500 10.6
0.3125 11.6
0.3750 13.9
0.4375 16.2
0.5000 18.4
ストリーム
数
CPU
負荷割合
実行時間
[ms]
16
0.5625 20.6
0.6250 22.9
0.6875 25.1
0.7500 27.5
0.8125 29.6
0.8750 31.9
0.9375 34.3
1.0000 36.3
grouseではCPUが全体の処理の1/4を処理すると最も効率が良い
実行結果
2015/07/23先端GPGPUシミュレーション工学特論36
CPU負荷割合
実行時間[ms]
ストリーム数
OpenMPによる処理の効率化
2015/07/23先端GPGPUシミュレーション工学特論37
 CPUとGPUの協調版
 1スレッドが転送やカーネルを呼び出し
 全て呼び出した後にベクトル和を実行
 複数のスレッドを起動
 1スレッドをカーネル起動,非同期転送呼出に充てる
 CPUではベクトル和を並列に計算
OpenMP
2015/07/23先端GPGPUシミュレーション工学特論38
 並列に処理を実行させる箇所に指示句(ディレクティ
ブ)を挿入
 for文の並列化
 ディレクティブを一行追加(#pragma omp ~)
#pragma omp parallel for
for(int i=0; i<N; i++)
C[i] = A[i] + B[i]
#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;
}
逐次(並列化前)プログラム
2015/07/23先端GPGPUシミュレーション工学特論39
並列化プログラム
2015/07/23先端GPGPUシミュレーション工学特論40
#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;
}
OpenMPの指示文
2015/07/23先端GPGPUシミュレーション工学特論41
 並列処理制御
 OpenMPで並列処理を行う領域の定義
 並列実行領域(Parallel Region)構文
 ワークシェアリング(Work sharing)構文
 同期制御
 OpenMP並列領域内でのデータアクセス,命令実行の同期
 データ属性制御
 並列領域内で利用されるデータの属性を定義
 その他
並列実行領域(Parallel Region)構文
2015/07/23先端GPGPUシミュレーション工学特論42
 parallel構文
 parallel構文で指示された領域では指定されたスレッド
が並列に処理を実行
 全てのスレッドが同じ処理を実行
#pragma omp parallel //{ <‐ここに括弧を書くとエラー
{
複数のスレッドが起動され,ここに書いてある処理を実行
全てのスレッドが同じ処理を実行
}
ワークシェアリング(Work sharing)構文
2015/07/23先端GPGPUシミュレーション工学特論43
 for構文
 parallel構文で指定された並列実行領域内で利用
 直後のforループを各スレッドに分割して並列処理を実行
 for(初期化;継続条件;再初期化)で構成されるforルー
プが対象
 全てのスレッドが処理を終了するまで他のスレッドは待機
#pragma omp parallel
{
#pragma omp for
for(i=0; i<N; i++){
forループを自動的に分割して各スレッドが実行
}
全てのスレッドが処理を終了するまで待機
}
single構文
2015/07/23先端GPGPUシミュレーション工学特論44
 parallel構文で指定された並列実行領域内で利用
 一つのスレッドのみが処理を実行
 処理を終了するまで他のスレッドは待機
 待機させる必要がない場合はnowait節を指定
#pragma omp parallel
{
#pragma omp single
{
1スレッドのみが処理を実行
他のスレッドは待機
}
single構文内のスレッドが処理を終了するまで待機
}
nowait指示節
2015/07/23先端GPGPUシミュレーション工学特論45
 ワークシェア構文で指定されたブロックの最後で同
期せず,処理を継続
 全スレッドが処理を終了するまで待たず,次の処理を実行
#pragma omp parallel
{
#pragma omp single nowait
{
1スレッドのみが処理を実行
他のスレッドは待機せず,以降の処理を実行
}
...
}
#include<stdio.h>
#include<stdlib.h>
#include<omp.h>
#define N (1024*1024*8)
#define Nbytes (N*sizeof(float))
#define NT 256
#define NB (N/NT)
#define Stream 4
#define CPU 2
#define Threads 12
//カーネルは変更なし
__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;
}
//カーネルは変更なし
__global__ void add
(float *a, float *b, float *c){
int i = blockIdx.x*blockDim.x
+ threadIdx.x;
c[i] = a[i] + b[i];
}
ベクトル和(CPUをOpenMPで並列化)
2015/07/23先端GPGPUシミュレーション工学特論46
vectoradd_coop_omp.cu
int main(){
float *a,*b,*c;
int stm;
cudaStream_t stream[Stream];
float *host_a, *host_b, *host_c;
cudaHostAlloc((void **)&host_c,
Nbytes, cudaHostAllocDefault);
cudaHostAlloc((void **)&host_a,
Nbytes, cudaHostAllocDefault);
cudaHostAlloc((void **)&host_b,
Nbytes, cudaHostAllocDefault);
for(int i=0;i<N;i++){
host_a[i] = 1.0f;
host_b[i] = 2.0f;
host_c[i] = 0;
}
for(stm=0;stm<Stream‐CPU;stm++){
cudaStreamCreate(&stream[stm]);
}
cudaMalloc( (void **)&a, Nbytes);
cudaMalloc( (void **)&b, Nbytes);
cudaMalloc( (void **)&c, Nbytes);
omp_set_num_threads(Threads);
double time_start = omp_get_wtime();
#pragma omp parallel
{
ベクトル和(CPUをOpenMPで並列化)
2015/07/23先端GPGPUシミュレーション工学特論47
vectoradd_coop_omp.cu
#pragma omp single nowait
{
for(stm=0;stm<Stream‐CPU;stm++){
int idx = stm*N/Stream;
cudaMemcpyAsync(&a[idx], &host_a[idx], Nbytes/Stream,  
cudaMemcpyHostToDevice,stream[stm]);
cudaMemcpyAsync(&b[idx], &host_b[idx], Nbytes/Stream, 
cudaMemcpyHostToDevice,stream[stm]);
add<<< NB/Stream, NT, 0 ,stream[stm]>>>(&a[idx],&b[idx],&c[idx]);
cudaMemcpyAsync(&host_c[idx], &c[idx], Nbytes/Stream, 
cudaMemcpyDeviceToHost,stream[stm]);
}
#pragma omp for
for(int i=(Stream‐CPU)*N/Stream;i<N;i++)
host_c[i] = host_a[i] + host_b[i];
}
} //#pragma omp parallelの終端
ベクトル和(CPUをOpenMPで並列化)
2015/07/23先端GPGPUシミュレーション工学特論48
vectoradd_coop_omp.cu
cudaDeviceSynchronize();
double time_end = omp_get_wtime();
double sum=0;
for(int i=0;i<N;i++)sum+=host_c[i];
printf("%f¥n",sum/N);
printf("elapsed time = %f sec¥n",
time_end‐time_start);
cudaFreeHost(host_a);
cudaFreeHost(host_b);
cudaFreeHost(host_c);
cudaFree(a);
cudaFree(b);
cudaFree(c);
for(stm=0;stm<Stream‐CPU;stm++){
cudaStreamDestroy(stream[stm]);
}
return 0;
}
ベクトル和(CPUをOpenMPで並列化)
2015/07/23先端GPGPUシミュレーション工学特論49
vectoradd_coop_omp.cu
実行結果
2015/07/23先端GPGPUシミュレーション工学特論50
 配列の要素数 N=223
 1ブロックあたりのスレッド数 256
 ストリームの数,CPUの負荷割合,CPUスレッド数を
変えて計算
 OpenMPの関数を用いて実行時間を測定
 コンパイルにはオプション‐Xcompiler ‐fopenmpが必要
実行結果(CPUスレッドごとに最速となる条件)
2015/07/23先端GPGPUシミュレーション工学特論51
 スレッド数が多くなると実行時間が実行毎に変化
 1スレッドCPU+GPU協調版のような評価ができない
CPUスレッド数 ストリーム数 CPU負荷割合 実行時間[ms]
1 16 0.1875 11.4
2 16 0.3125 9.82
3 16 0.4375 8.32
4 16 0.4375 8.23
5 2 0.5000 10.1
6 16 0.3750 9.18
7 16 0.6875 8.89
8 16 0.6250 8.70
9 4 0.7500 8.87
10 16 0.7500 8.76
11 16 0.5625 10.3
12 16 0.4375 17.8
スレッド数の増加と
ともに,CPUの負荷
割合も増加させる
と高速化に有効
実行結果
2015/07/23先端GPGPUシミュレーション工学特論52
 CPU 1スレッド 36.4 ms
 GPU(1ストリーム) 17.5 ms
 GPU(16ストリーム) 14.0 ms
 CPUとGPUの協調 10.6 ms
 16ストリーム,CPU負荷割合0.25
 CPUとGPUの協調 8.23 ms
 CPU 4スレッド
 16ストリーム,CPU負荷割合0.4375
単一GPU,1ストリームの
2倍程度高速化
複数GPUでのストリームの利用
2015/07/23先端GPGPUシミュレーション工学特論53
 各GPUでストリームを作り,並行実行することが可能
 grouseでは
 CPUとGPU4台で非同期実行が可能
 各GPUに複数のストリームが存在し,処理を並行実行
 処理するデータの割当と管理,処理の進行状況の把握が
著しく複雑化
 注意点
 あるGPUが作成したストリームは他のGPUでは利用できない
 cudaSetDeviceでGPUを切り替えてからストリームを作成

More Related Content

What's hot

1072: アプリケーション開発を加速するCUDAライブラリ
1072: アプリケーション開発を加速するCUDAライブラリ1072: アプリケーション開発を加速するCUDAライブラリ
1072: アプリケーション開発を加速するCUDAライブラリNVIDIA Japan
 
強化学習アルゴリズムPPOの解説と実験
強化学習アルゴリズムPPOの解説と実験強化学習アルゴリズムPPOの解説と実験
強化学習アルゴリズムPPOの解説と実験克海 納谷
 
2015年度先端GPGPUシミュレーション工学特論 第7回 総和計算(Atomic演算)
2015年度先端GPGPUシミュレーション工学特論 第7回 総和計算(Atomic演算)2015年度先端GPGPUシミュレーション工学特論 第7回 総和計算(Atomic演算)
2015年度先端GPGPUシミュレーション工学特論 第7回 総和計算(Atomic演算)智啓 出川
 
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介Preferred Networks
 
いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門Fixstars Corporation
 
[Track2-2] 最新のNVIDIA AmpereアーキテクチャによるNVIDIA A100 TensorコアGPUの特長とその性能を引き出す方法
[Track2-2] 最新のNVIDIA AmpereアーキテクチャによるNVIDIA A100 TensorコアGPUの特長とその性能を引き出す方法[Track2-2] 最新のNVIDIA AmpereアーキテクチャによるNVIDIA A100 TensorコアGPUの特長とその性能を引き出す方法
[Track2-2] 最新のNVIDIA AmpereアーキテクチャによるNVIDIA A100 TensorコアGPUの特長とその性能を引き出す方法Deep Learning Lab(ディープラーニング・ラボ)
 
強化学習 DQNからPPOまで
強化学習 DQNからPPOまで強化学習 DQNからPPOまで
強化学習 DQNからPPOまでharmonylab
 
DLゼミ: MobileOne: An Improved One millisecond Mobile Backbone
DLゼミ: MobileOne: An Improved One millisecond Mobile BackboneDLゼミ: MobileOne: An Improved One millisecond Mobile Backbone
DLゼミ: MobileOne: An Improved One millisecond Mobile Backboneharmonylab
 
方策勾配型強化学習の基礎と応用
方策勾配型強化学習の基礎と応用方策勾配型強化学習の基礎と応用
方策勾配型強化学習の基礎と応用Ryo Iwaki
 
CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説
CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説
CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説Takateru Yamagishi
 
2015年度GPGPU実践プログラミング 第6回 パフォーマンス解析ツール
2015年度GPGPU実践プログラミング 第6回 パフォーマンス解析ツール2015年度GPGPU実践プログラミング 第6回 パフォーマンス解析ツール
2015年度GPGPU実践プログラミング 第6回 パフォーマンス解析ツール智啓 出川
 
2015年度GPGPU実践プログラミング 第5回 GPUのメモリ階層
2015年度GPGPU実践プログラミング 第5回 GPUのメモリ階層2015年度GPGPU実践プログラミング 第5回 GPUのメモリ階層
2015年度GPGPU実践プログラミング 第5回 GPUのメモリ階層智啓 出川
 
Introduction to A3C model
Introduction to A3C modelIntroduction to A3C model
Introduction to A3C modelWEBFARMER. ltd.
 
TensorFlowで逆強化学習
TensorFlowで逆強化学習TensorFlowで逆強化学習
TensorFlowで逆強化学習Mitsuhisa Ohta
 
2015年度GPGPU実践プログラミング 第1回 GPGPUの歴史と応用例
2015年度GPGPU実践プログラミング 第1回 GPGPUの歴史と応用例2015年度GPGPU実践プログラミング 第1回 GPGPUの歴史と応用例
2015年度GPGPU実践プログラミング 第1回 GPGPUの歴史と応用例智啓 出川
 
GPGPU Seminar (GPGPU and CUDA Fortran)
GPGPU Seminar (GPGPU and CUDA Fortran)GPGPU Seminar (GPGPU and CUDA Fortran)
GPGPU Seminar (GPGPU and CUDA Fortran)智啓 出川
 
GPGPU Seminar (GPU Accelerated Libraries, 1 of 3, cuBLAS)
GPGPU Seminar (GPU Accelerated Libraries, 1 of 3, cuBLAS) GPGPU Seminar (GPU Accelerated Libraries, 1 of 3, cuBLAS)
GPGPU Seminar (GPU Accelerated Libraries, 1 of 3, cuBLAS) 智啓 出川
 
深層強化学習の self-playで、複雑な行動を機械に学習させたい!
深層強化学習の self-playで、複雑な行動を機械に学習させたい!深層強化学習の self-playで、複雑な行動を機械に学習させたい!
深層強化学習の self-playで、複雑な行動を機械に学習させたい!Junichiro Katsuta
 
CUDAプログラミング入門
CUDAプログラミング入門CUDAプログラミング入門
CUDAプログラミング入門NVIDIA Japan
 
Cuda fortranの利便性を高めるfortran言語の機能
Cuda fortranの利便性を高めるfortran言語の機能Cuda fortranの利便性を高めるfortran言語の機能
Cuda fortranの利便性を高めるfortran言語の機能智啓 出川
 

What's hot (20)

1072: アプリケーション開発を加速するCUDAライブラリ
1072: アプリケーション開発を加速するCUDAライブラリ1072: アプリケーション開発を加速するCUDAライブラリ
1072: アプリケーション開発を加速するCUDAライブラリ
 
強化学習アルゴリズムPPOの解説と実験
強化学習アルゴリズムPPOの解説と実験強化学習アルゴリズムPPOの解説と実験
強化学習アルゴリズムPPOの解説と実験
 
2015年度先端GPGPUシミュレーション工学特論 第7回 総和計算(Atomic演算)
2015年度先端GPGPUシミュレーション工学特論 第7回 総和計算(Atomic演算)2015年度先端GPGPUシミュレーション工学特論 第7回 総和計算(Atomic演算)
2015年度先端GPGPUシミュレーション工学特論 第7回 総和計算(Atomic演算)
 
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
 
いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門
 
[Track2-2] 最新のNVIDIA AmpereアーキテクチャによるNVIDIA A100 TensorコアGPUの特長とその性能を引き出す方法
[Track2-2] 最新のNVIDIA AmpereアーキテクチャによるNVIDIA A100 TensorコアGPUの特長とその性能を引き出す方法[Track2-2] 最新のNVIDIA AmpereアーキテクチャによるNVIDIA A100 TensorコアGPUの特長とその性能を引き出す方法
[Track2-2] 最新のNVIDIA AmpereアーキテクチャによるNVIDIA A100 TensorコアGPUの特長とその性能を引き出す方法
 
強化学習 DQNからPPOまで
強化学習 DQNからPPOまで強化学習 DQNからPPOまで
強化学習 DQNからPPOまで
 
DLゼミ: MobileOne: An Improved One millisecond Mobile Backbone
DLゼミ: MobileOne: An Improved One millisecond Mobile BackboneDLゼミ: MobileOne: An Improved One millisecond Mobile Backbone
DLゼミ: MobileOne: An Improved One millisecond Mobile Backbone
 
方策勾配型強化学習の基礎と応用
方策勾配型強化学習の基礎と応用方策勾配型強化学習の基礎と応用
方策勾配型強化学習の基礎と応用
 
CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説
CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説
CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説
 
2015年度GPGPU実践プログラミング 第6回 パフォーマンス解析ツール
2015年度GPGPU実践プログラミング 第6回 パフォーマンス解析ツール2015年度GPGPU実践プログラミング 第6回 パフォーマンス解析ツール
2015年度GPGPU実践プログラミング 第6回 パフォーマンス解析ツール
 
2015年度GPGPU実践プログラミング 第5回 GPUのメモリ階層
2015年度GPGPU実践プログラミング 第5回 GPUのメモリ階層2015年度GPGPU実践プログラミング 第5回 GPUのメモリ階層
2015年度GPGPU実践プログラミング 第5回 GPUのメモリ階層
 
Introduction to A3C model
Introduction to A3C modelIntroduction to A3C model
Introduction to A3C model
 
TensorFlowで逆強化学習
TensorFlowで逆強化学習TensorFlowで逆強化学習
TensorFlowで逆強化学習
 
2015年度GPGPU実践プログラミング 第1回 GPGPUの歴史と応用例
2015年度GPGPU実践プログラミング 第1回 GPGPUの歴史と応用例2015年度GPGPU実践プログラミング 第1回 GPGPUの歴史と応用例
2015年度GPGPU実践プログラミング 第1回 GPGPUの歴史と応用例
 
GPGPU Seminar (GPGPU and CUDA Fortran)
GPGPU Seminar (GPGPU and CUDA Fortran)GPGPU Seminar (GPGPU and CUDA Fortran)
GPGPU Seminar (GPGPU and CUDA Fortran)
 
GPGPU Seminar (GPU Accelerated Libraries, 1 of 3, cuBLAS)
GPGPU Seminar (GPU Accelerated Libraries, 1 of 3, cuBLAS) GPGPU Seminar (GPU Accelerated Libraries, 1 of 3, cuBLAS)
GPGPU Seminar (GPU Accelerated Libraries, 1 of 3, cuBLAS)
 
深層強化学習の self-playで、複雑な行動を機械に学習させたい!
深層強化学習の self-playで、複雑な行動を機械に学習させたい!深層強化学習の self-playで、複雑な行動を機械に学習させたい!
深層強化学習の self-playで、複雑な行動を機械に学習させたい!
 
CUDAプログラミング入門
CUDAプログラミング入門CUDAプログラミング入門
CUDAプログラミング入門
 
Cuda fortranの利便性を高めるfortran言語の機能
Cuda fortranの利便性を高めるfortran言語の機能Cuda fortranの利便性を高めるfortran言語の機能
Cuda fortranの利便性を高めるfortran言語の機能
 

Viewers also liked

EthernetやCPUなどの話
EthernetやCPUなどの話EthernetやCPUなどの話
EthernetやCPUなどの話Takanori Sejima
 
経験過程
経験過程経験過程
経験過程hoxo_m
 
カップルが一緒にお風呂に入る割合をベイズ推定してみた
カップルが一緒にお風呂に入る割合をベイズ推定してみたカップルが一緒にお風呂に入る割合をベイズ推定してみた
カップルが一緒にお風呂に入る割合をベイズ推定してみたhoxo_m
 
Windows10の展開手法
Windows10の展開手法Windows10の展開手法
Windows10の展開手法NAOKI ABE
 
ベイズ基本0425
ベイズ基本0425ベイズ基本0425
ベイズ基本0425asato kuno
 
AtCoder Regular Contest 016 解説
AtCoder Regular Contest 016 解説AtCoder Regular Contest 016 解説
AtCoder Regular Contest 016 解説AtCoder Inc.
 
H231126 統計および確率を利用した予測と判断rev1
H231126 統計および確率を利用した予測と判断rev1H231126 統計および確率を利用した予測と判断rev1
H231126 統計および確率を利用した予測と判断rev1Kenichi Takara
 
統計勉強会 LT ベイジアンって?
統計勉強会 LT ベイジアンって?統計勉強会 LT ベイジアンって?
統計勉強会 LT ベイジアンって?Yuto Suzuki
 
確率論基礎
確率論基礎確率論基礎
確率論基礎hoxo_m
 
MLaPP 2章 「確率」(前編)
MLaPP 2章 「確率」(前編)MLaPP 2章 「確率」(前編)
MLaPP 2章 「確率」(前編)Shinichi Tamura
 
仕事の流儀 Vol1 基本編_ver1.1_外部公開ver
仕事の流儀 Vol1 基本編_ver1.1_外部公開ver仕事の流儀 Vol1 基本編_ver1.1_外部公開ver
仕事の流儀 Vol1 基本編_ver1.1_外部公開verHirotaka Nishimiya
 
「数学の世界」発表資料
「数学の世界」発表資料「数学の世界」発表資料
「数学の世界」発表資料spdbear
 
便利な数を100億個の乱数から算出
便利な数を100億個の乱数から算出便利な数を100億個の乱数から算出
便利な数を100億個の乱数から算出Toshiyuki Shimono
 
TensorFlowで学ぶDQN
TensorFlowで学ぶDQNTensorFlowで学ぶDQN
TensorFlowで学ぶDQNEtsuji Nakai
 
ベイズ統計入門
ベイズ統計入門ベイズ統計入門
ベイズ統計入門Miyoshi Yuya
 
10年効く分散ファイルシステム技術 GlusterFS & Red Hat Storage
10年効く分散ファイルシステム技術 GlusterFS & Red Hat Storage10年効く分散ファイルシステム技術 GlusterFS & Red Hat Storage
10年効く分散ファイルシステム技術 GlusterFS & Red Hat StorageEtsuji Nakai
 
ゼロから始める自作 CPU 入門
ゼロから始める自作 CPU 入門ゼロから始める自作 CPU 入門
ゼロから始める自作 CPU 入門Hirotaka Kawata
 

Viewers also liked (20)

Cpu pipeline basics
Cpu pipeline basicsCpu pipeline basics
Cpu pipeline basics
 
EthernetやCPUなどの話
EthernetやCPUなどの話EthernetやCPUなどの話
EthernetやCPUなどの話
 
Life with jupyter
Life with jupyterLife with jupyter
Life with jupyter
 
経験過程
経験過程経験過程
経験過程
 
カップルが一緒にお風呂に入る割合をベイズ推定してみた
カップルが一緒にお風呂に入る割合をベイズ推定してみたカップルが一緒にお風呂に入る割合をベイズ推定してみた
カップルが一緒にお風呂に入る割合をベイズ推定してみた
 
Windows10の展開手法
Windows10の展開手法Windows10の展開手法
Windows10の展開手法
 
ベイズ基本0425
ベイズ基本0425ベイズ基本0425
ベイズ基本0425
 
AtCoder Regular Contest 016 解説
AtCoder Regular Contest 016 解説AtCoder Regular Contest 016 解説
AtCoder Regular Contest 016 解説
 
H231126 統計および確率を利用した予測と判断rev1
H231126 統計および確率を利用した予測と判断rev1H231126 統計および確率を利用した予測と判断rev1
H231126 統計および確率を利用した予測と判断rev1
 
統計勉強会 LT ベイジアンって?
統計勉強会 LT ベイジアンって?統計勉強会 LT ベイジアンって?
統計勉強会 LT ベイジアンって?
 
確率論基礎
確率論基礎確率論基礎
確率論基礎
 
Cpu cache arch
Cpu cache archCpu cache arch
Cpu cache arch
 
MLaPP 2章 「確率」(前編)
MLaPP 2章 「確率」(前編)MLaPP 2章 「確率」(前編)
MLaPP 2章 「確率」(前編)
 
仕事の流儀 Vol1 基本編_ver1.1_外部公開ver
仕事の流儀 Vol1 基本編_ver1.1_外部公開ver仕事の流儀 Vol1 基本編_ver1.1_外部公開ver
仕事の流儀 Vol1 基本編_ver1.1_外部公開ver
 
「数学の世界」発表資料
「数学の世界」発表資料「数学の世界」発表資料
「数学の世界」発表資料
 
便利な数を100億個の乱数から算出
便利な数を100億個の乱数から算出便利な数を100億個の乱数から算出
便利な数を100億個の乱数から算出
 
TensorFlowで学ぶDQN
TensorFlowで学ぶDQNTensorFlowで学ぶDQN
TensorFlowで学ぶDQN
 
ベイズ統計入門
ベイズ統計入門ベイズ統計入門
ベイズ統計入門
 
10年効く分散ファイルシステム技術 GlusterFS & Red Hat Storage
10年効く分散ファイルシステム技術 GlusterFS & Red Hat Storage10年効く分散ファイルシステム技術 GlusterFS & Red Hat Storage
10年効く分散ファイルシステム技術 GlusterFS & Red Hat Storage
 
ゼロから始める自作 CPU 入門
ゼロから始める自作 CPU 入門ゼロから始める自作 CPU 入門
ゼロから始める自作 CPU 入門
 

Similar to 2015年度先端GPGPUシミュレーション工学特論 第15回 CPUとGPUの協調

2015年度先端GPGPUシミュレーション工学特論 第14回 複数GPUの利用
2015年度先端GPGPUシミュレーション工学特論 第14回 複数GPUの利用2015年度先端GPGPUシミュレーション工学特論 第14回 複数GPUの利用
2015年度先端GPGPUシミュレーション工学特論 第14回 複数GPUの利用智啓 出川
 
2012 1203-researchers-cafe
2012 1203-researchers-cafe2012 1203-researchers-cafe
2012 1203-researchers-cafeToshiya Komoda
 
2015年度GPGPU実践基礎工学 第8回 並列計算の概念 (プロセスとスレッド)
2015年度GPGPU実践基礎工学 第8回 並列計算の概念(プロセスとスレッド)2015年度GPGPU実践基礎工学 第8回 並列計算の概念(プロセスとスレッド)
2015年度GPGPU実践基礎工学 第8回 並列計算の概念 (プロセスとスレッド)智啓 出川
 
2015年度GPGPU実践プログラミング 第15回 GPU最適化ライブラリ
2015年度GPGPU実践プログラミング 第15回 GPU最適化ライブラリ2015年度GPGPU実践プログラミング 第15回 GPU最適化ライブラリ
2015年度GPGPU実践プログラミング 第15回 GPU最適化ライブラリ智啓 出川
 
GPGPU Education at Nagaoka University of Technology: A Trial Run
GPGPU Education at Nagaoka University of Technology: A Trial RunGPGPU Education at Nagaoka University of Technology: A Trial Run
GPGPU Education at Nagaoka University of Technology: A Trial Run智啓 出川
 
2015年度GPGPU実践基礎工学 第11回 GPUでの並列 プログラミング(ベクトル和)
2015年度GPGPU実践基礎工学 第11回 GPUでの並列プログラミング(ベクトル和)2015年度GPGPU実践基礎工学 第11回 GPUでの並列プログラミング(ベクトル和)
2015年度GPGPU実践基礎工学 第11回 GPUでの並列 プログラミング(ベクトル和)智啓 出川
 
2015年度先端GPGPUシミュレーション工学特論 第1回 先端シミュレーションおよび産業界におけるGPUの役割
2015年度先端GPGPUシミュレーション工学特論 第1回 先端シミュレーションおよび産業界におけるGPUの役割2015年度先端GPGPUシミュレーション工学特論 第1回 先端シミュレーションおよび産業界におけるGPUの役割
2015年度先端GPGPUシミュレーション工学特論 第1回 先端シミュレーションおよび産業界におけるGPUの役割智啓 出川
 
2015年度GPGPU実践基礎工学 第3回 GPUクラスタ上でのプログラミング(CUDA)
2015年度GPGPU実践基礎工学 第3回 GPUクラスタ上でのプログラミング(CUDA)2015年度GPGPU実践基礎工学 第3回 GPUクラスタ上でのプログラミング(CUDA)
2015年度GPGPU実践基礎工学 第3回 GPUクラスタ上でのプログラミング(CUDA)智啓 出川
 
2015年度GPGPU実践プログラミング 第4回 GPUでの並列プログラミング(ベクトル和,移動平均,差分法)
2015年度GPGPU実践プログラミング 第4回 GPUでの並列プログラミング(ベクトル和,移動平均,差分法)2015年度GPGPU実践プログラミング 第4回 GPUでの並列プログラミング(ベクトル和,移動平均,差分法)
2015年度GPGPU実践プログラミング 第4回 GPUでの並列プログラミング(ベクトル和,移動平均,差分法)智啓 出川
 
研究生のためのC++ no.7
研究生のためのC++ no.7研究生のためのC++ no.7
研究生のためのC++ no.7Tomohiro Namba
 
2015年度GPGPU実践基礎工学 第4回 CPUのアーキテクチャ
2015年度GPGPU実践基礎工学 第4回 CPUのアーキテクチャ2015年度GPGPU実践基礎工学 第4回 CPUのアーキテクチャ
2015年度GPGPU実践基礎工学 第4回 CPUのアーキテクチャ智啓 出川
 
気候モデル放射カーネルのGPUへの移植と高速化
気候モデル放射カーネルのGPUへの移植と高速化気候モデル放射カーネルのGPUへの移植と高速化
気候モデル放射カーネルのGPUへの移植と高速化Takateru Yamagishi
 
2015年度GPGPU実践プログラミング 第8回 総和計算(高度な最適化)
2015年度GPGPU実践プログラミング 第8回 総和計算(高度な最適化)2015年度GPGPU実践プログラミング 第8回 総和計算(高度な最適化)
2015年度GPGPU実践プログラミング 第8回 総和計算(高度な最適化)智啓 出川
 
2015年度GPGPU実践基礎工学 第12回 GPUによる画像処理
2015年度GPGPU実践基礎工学 第12回 GPUによる画像処理2015年度GPGPU実践基礎工学 第12回 GPUによる画像処理
2015年度GPGPU実践基礎工学 第12回 GPUによる画像処理智啓 出川
 
2015年度GPGPU実践プログラミング 第3回 GPGPUプログラミング環境
2015年度GPGPU実践プログラミング 第3回 GPGPUプログラミング環境2015年度GPGPU実践プログラミング 第3回 GPGPUプログラミング環境
2015年度GPGPU実践プログラミング 第3回 GPGPUプログラミング環境智啓 出川
 
2015年度GPGPU実践基礎工学 第6回 ソフトウェアによるCPUの高速化技術
2015年度GPGPU実践基礎工学 第6回 ソフトウェアによるCPUの高速化技術2015年度GPGPU実践基礎工学 第6回 ソフトウェアによるCPUの高速化技術
2015年度GPGPU実践基礎工学 第6回 ソフトウェアによるCPUの高速化技術智啓 出川
 
2015年度GPGPU実践基礎工学 第10回 GPUのプログラム構造
2015年度GPGPU実践基礎工学 第10回 GPUのプログラム構造2015年度GPGPU実践基礎工学 第10回 GPUのプログラム構造
2015年度GPGPU実践基礎工学 第10回 GPUのプログラム構造智啓 出川
 
2015年度GPGPU実践プログラミング 第2回 GPUのアーキテクチャとプログラム構造
2015年度GPGPU実践プログラミング 第2回 GPUのアーキテクチャとプログラム構造2015年度GPGPU実践プログラミング 第2回 GPUのアーキテクチャとプログラム構造
2015年度GPGPU実践プログラミング 第2回 GPUのアーキテクチャとプログラム構造智啓 出川
 
2015年度GPGPU実践基礎工学 第1回 学際的分野における先端シミュレーション技術の歴史
2015年度GPGPU実践基礎工学 第1回 学際的分野における先端シミュレーション技術の歴史2015年度GPGPU実践基礎工学 第1回 学際的分野における先端シミュレーション技術の歴史
2015年度GPGPU実践基礎工学 第1回 学際的分野における先端シミュレーション技術の歴史智啓 出川
 

Similar to 2015年度先端GPGPUシミュレーション工学特論 第15回 CPUとGPUの協調 (20)

2015年度先端GPGPUシミュレーション工学特論 第14回 複数GPUの利用
2015年度先端GPGPUシミュレーション工学特論 第14回 複数GPUの利用2015年度先端GPGPUシミュレーション工学特論 第14回 複数GPUの利用
2015年度先端GPGPUシミュレーション工学特論 第14回 複数GPUの利用
 
2012 1203-researchers-cafe
2012 1203-researchers-cafe2012 1203-researchers-cafe
2012 1203-researchers-cafe
 
2015年度GPGPU実践基礎工学 第8回 並列計算の概念 (プロセスとスレッド)
2015年度GPGPU実践基礎工学 第8回 並列計算の概念(プロセスとスレッド)2015年度GPGPU実践基礎工学 第8回 並列計算の概念(プロセスとスレッド)
2015年度GPGPU実践基礎工学 第8回 並列計算の概念 (プロセスとスレッド)
 
2015年度GPGPU実践プログラミング 第15回 GPU最適化ライブラリ
2015年度GPGPU実践プログラミング 第15回 GPU最適化ライブラリ2015年度GPGPU実践プログラミング 第15回 GPU最適化ライブラリ
2015年度GPGPU実践プログラミング 第15回 GPU最適化ライブラリ
 
GPGPU Education at Nagaoka University of Technology: A Trial Run
GPGPU Education at Nagaoka University of Technology: A Trial RunGPGPU Education at Nagaoka University of Technology: A Trial Run
GPGPU Education at Nagaoka University of Technology: A Trial Run
 
2015年度GPGPU実践基礎工学 第11回 GPUでの並列 プログラミング(ベクトル和)
2015年度GPGPU実践基礎工学 第11回 GPUでの並列プログラミング(ベクトル和)2015年度GPGPU実践基礎工学 第11回 GPUでの並列プログラミング(ベクトル和)
2015年度GPGPU実践基礎工学 第11回 GPUでの並列 プログラミング(ベクトル和)
 
2015年度先端GPGPUシミュレーション工学特論 第1回 先端シミュレーションおよび産業界におけるGPUの役割
2015年度先端GPGPUシミュレーション工学特論 第1回 先端シミュレーションおよび産業界におけるGPUの役割2015年度先端GPGPUシミュレーション工学特論 第1回 先端シミュレーションおよび産業界におけるGPUの役割
2015年度先端GPGPUシミュレーション工学特論 第1回 先端シミュレーションおよび産業界におけるGPUの役割
 
2015年度GPGPU実践基礎工学 第3回 GPUクラスタ上でのプログラミング(CUDA)
2015年度GPGPU実践基礎工学 第3回 GPUクラスタ上でのプログラミング(CUDA)2015年度GPGPU実践基礎工学 第3回 GPUクラスタ上でのプログラミング(CUDA)
2015年度GPGPU実践基礎工学 第3回 GPUクラスタ上でのプログラミング(CUDA)
 
2015年度GPGPU実践プログラミング 第4回 GPUでの並列プログラミング(ベクトル和,移動平均,差分法)
2015年度GPGPU実践プログラミング 第4回 GPUでの並列プログラミング(ベクトル和,移動平均,差分法)2015年度GPGPU実践プログラミング 第4回 GPUでの並列プログラミング(ベクトル和,移動平均,差分法)
2015年度GPGPU実践プログラミング 第4回 GPUでの並列プログラミング(ベクトル和,移動平均,差分法)
 
研究生のためのC++ no.7
研究生のためのC++ no.7研究生のためのC++ no.7
研究生のためのC++ no.7
 
2015年度GPGPU実践基礎工学 第4回 CPUのアーキテクチャ
2015年度GPGPU実践基礎工学 第4回 CPUのアーキテクチャ2015年度GPGPU実践基礎工学 第4回 CPUのアーキテクチャ
2015年度GPGPU実践基礎工学 第4回 CPUのアーキテクチャ
 
気候モデル放射カーネルのGPUへの移植と高速化
気候モデル放射カーネルのGPUへの移植と高速化気候モデル放射カーネルのGPUへの移植と高速化
気候モデル放射カーネルのGPUへの移植と高速化
 
20130126 sc12-reading
20130126 sc12-reading20130126 sc12-reading
20130126 sc12-reading
 
2015年度GPGPU実践プログラミング 第8回 総和計算(高度な最適化)
2015年度GPGPU実践プログラミング 第8回 総和計算(高度な最適化)2015年度GPGPU実践プログラミング 第8回 総和計算(高度な最適化)
2015年度GPGPU実践プログラミング 第8回 総和計算(高度な最適化)
 
2015年度GPGPU実践基礎工学 第12回 GPUによる画像処理
2015年度GPGPU実践基礎工学 第12回 GPUによる画像処理2015年度GPGPU実践基礎工学 第12回 GPUによる画像処理
2015年度GPGPU実践基礎工学 第12回 GPUによる画像処理
 
2015年度GPGPU実践プログラミング 第3回 GPGPUプログラミング環境
2015年度GPGPU実践プログラミング 第3回 GPGPUプログラミング環境2015年度GPGPU実践プログラミング 第3回 GPGPUプログラミング環境
2015年度GPGPU実践プログラミング 第3回 GPGPUプログラミング環境
 
2015年度GPGPU実践基礎工学 第6回 ソフトウェアによるCPUの高速化技術
2015年度GPGPU実践基礎工学 第6回 ソフトウェアによるCPUの高速化技術2015年度GPGPU実践基礎工学 第6回 ソフトウェアによるCPUの高速化技術
2015年度GPGPU実践基礎工学 第6回 ソフトウェアによるCPUの高速化技術
 
2015年度GPGPU実践基礎工学 第10回 GPUのプログラム構造
2015年度GPGPU実践基礎工学 第10回 GPUのプログラム構造2015年度GPGPU実践基礎工学 第10回 GPUのプログラム構造
2015年度GPGPU実践基礎工学 第10回 GPUのプログラム構造
 
2015年度GPGPU実践プログラミング 第2回 GPUのアーキテクチャとプログラム構造
2015年度GPGPU実践プログラミング 第2回 GPUのアーキテクチャとプログラム構造2015年度GPGPU実践プログラミング 第2回 GPUのアーキテクチャとプログラム構造
2015年度GPGPU実践プログラミング 第2回 GPUのアーキテクチャとプログラム構造
 
2015年度GPGPU実践基礎工学 第1回 学際的分野における先端シミュレーション技術の歴史
2015年度GPGPU実践基礎工学 第1回 学際的分野における先端シミュレーション技術の歴史2015年度GPGPU実践基礎工学 第1回 学際的分野における先端シミュレーション技術の歴史
2015年度GPGPU実践基礎工学 第1回 学際的分野における先端シミュレーション技術の歴史
 

More from 智啓 出川

Fortranが拓く世界、VSCodeが架ける橋
Fortranが拓く世界、VSCodeが架ける橋Fortranが拓く世界、VSCodeが架ける橋
Fortranが拓く世界、VSCodeが架ける橋智啓 出川
 
Very helpful python code to find coefficients of the finite difference method
Very helpful python code to find coefficients of the finite difference methodVery helpful python code to find coefficients of the finite difference method
Very helpful python code to find coefficients of the finite difference method智啓 出川
 
Why do we confuse String and Array of Characters in Fortran?
Why do we confuse String and Array of Characters in Fortran?Why do we confuse String and Array of Characters in Fortran?
Why do we confuse String and Array of Characters in Fortran?智啓 出川
 
Pythonによる累乗近似
Pythonによる累乗近似Pythonによる累乗近似
Pythonによる累乗近似智啓 出川
 
数値計算結果のPythonによる後処理について(1次元データのピーク値およびその位置の推定)
数値計算結果のPythonによる後処理について(1次元データのピーク値およびその位置の推定)数値計算結果のPythonによる後処理について(1次元データのピーク値およびその位置の推定)
数値計算結果のPythonによる後処理について(1次元データのピーク値およびその位置の推定)智啓 出川
 
オブジェクト指向Fortranが拓く(はずだった)新しい世界
オブジェクト指向Fortranが拓く(はずだった)新しい世界オブジェクト指向Fortranが拓く(はずだった)新しい世界
オブジェクト指向Fortranが拓く(はずだった)新しい世界智啓 出川
 
Schematic diagrams of GPUs' architecture and Time evolution of theoretical FL...
Schematic diagrams of GPUs' architecture and Time evolution of theoretical FL...Schematic diagrams of GPUs' architecture and Time evolution of theoretical FL...
Schematic diagrams of GPUs' architecture and Time evolution of theoretical FL...智啓 出川
 
GPGPU Seminar (GPU Accelerated Libraries, 3 of 3, Thrust)
GPGPU Seminar (GPU Accelerated Libraries, 3 of 3, Thrust) GPGPU Seminar (GPU Accelerated Libraries, 3 of 3, Thrust)
GPGPU Seminar (GPU Accelerated Libraries, 3 of 3, Thrust) 智啓 出川
 
GPGPU Seminar (GPU Accelerated Libraries, 2 of 3, cuSPARSE)
GPGPU Seminar (GPU Accelerated Libraries, 2 of 3, cuSPARSE) GPGPU Seminar (GPU Accelerated Libraries, 2 of 3, cuSPARSE)
GPGPU Seminar (GPU Accelerated Libraries, 2 of 3, cuSPARSE) 智啓 出川
 
PGI CUDA FortranとGPU最適化ライブラリの一連携法
PGI CUDA FortranとGPU最適化ライブラリの一連携法PGI CUDA FortranとGPU最適化ライブラリの一連携法
PGI CUDA FortranとGPU最適化ライブラリの一連携法智啓 出川
 
教育機関でのJetsonの活用の可能性
教育機関でのJetsonの活用の可能性教育機関でのJetsonの活用の可能性
教育機関でのJetsonの活用の可能性智啓 出川
 
GPGPU Seminar (Accelerataion of Lattice Boltzmann Method using CUDA Fortran)
GPGPU Seminar (Accelerataion of Lattice Boltzmann Method using CUDA Fortran)GPGPU Seminar (Accelerataion of Lattice Boltzmann Method using CUDA Fortran)
GPGPU Seminar (Accelerataion of Lattice Boltzmann Method using CUDA Fortran)智啓 出川
 
GPGPU Seminar (PyCUDA)
GPGPU Seminar (PyCUDA)GPGPU Seminar (PyCUDA)
GPGPU Seminar (PyCUDA)智啓 出川
 
2015年度先端GPGPUシミュレーション工学特論 第13回 数値流体力学への応用 (高度な最適化)
2015年度先端GPGPUシミュレーション工学特論 第13回 数値流体力学への応用(高度な最適化)2015年度先端GPGPUシミュレーション工学特論 第13回 数値流体力学への応用(高度な最適化)
2015年度先端GPGPUシミュレーション工学特論 第13回 数値流体力学への応用 (高度な最適化)智啓 出川
 
2015年度先端GPGPUシミュレーション工学特論 第11回 数値流体力学への応用 (支配方程式,CPUプログラム)
2015年度先端GPGPUシミュレーション工学特論 第11回 数値流体力学への応用(支配方程式,CPUプログラム)2015年度先端GPGPUシミュレーション工学特論 第11回 数値流体力学への応用(支配方程式,CPUプログラム)
2015年度先端GPGPUシミュレーション工学特論 第11回 数値流体力学への応用 (支配方程式,CPUプログラム)智啓 出川
 
2015年度先端GPGPUシミュレーション工学特論 第10回 Poisson方程式の求解 (線形連立一次方程式)
2015年度先端GPGPUシミュレーション工学特論 第10回 Poisson方程式の求解(線形連立一次方程式)2015年度先端GPGPUシミュレーション工学特論 第10回 Poisson方程式の求解(線形連立一次方程式)
2015年度先端GPGPUシミュレーション工学特論 第10回 Poisson方程式の求解 (線形連立一次方程式)智啓 出川
 
2015年度先端GPGPUシミュレーション工学特論 第9回 偏微分方程式の差分計算 (移流方程式)
2015年度先端GPGPUシミュレーション工学特論 第9回 偏微分方程式の差分計算(移流方程式)2015年度先端GPGPUシミュレーション工学特論 第9回 偏微分方程式の差分計算(移流方程式)
2015年度先端GPGPUシミュレーション工学特論 第9回 偏微分方程式の差分計算 (移流方程式)智啓 出川
 
2015年度先端GPGPUシミュレーション工学特論 第8回 偏微分方程式の差分計算 (拡散方程式)
2015年度先端GPGPUシミュレーション工学特論 第8回 偏微分方程式の差分計算(拡散方程式)2015年度先端GPGPUシミュレーション工学特論 第8回 偏微分方程式の差分計算(拡散方程式)
2015年度先端GPGPUシミュレーション工学特論 第8回 偏微分方程式の差分計算 (拡散方程式)智啓 出川
 
2015年度先端GPGPUシミュレーション工学特論 第6回 プログラムの性能評価指針 (Flop/Byte,計算律速,メモリ律速)
2015年度先端GPGPUシミュレーション工学特論 第6回 プログラムの性能評価指針(Flop/Byte,計算律速,メモリ律速)2015年度先端GPGPUシミュレーション工学特論 第6回 プログラムの性能評価指針(Flop/Byte,計算律速,メモリ律速)
2015年度先端GPGPUシミュレーション工学特論 第6回 プログラムの性能評価指針 (Flop/Byte,計算律速,メモリ律速)智啓 出川
 
2015年度先端GPGPUシミュレーション工学特論 第5回 GPUのメモリ階層の詳細 (様々なメモリの利用)
2015年度先端GPGPUシミュレーション工学特論 第5回 GPUのメモリ階層の詳細(様々なメモリの利用)2015年度先端GPGPUシミュレーション工学特論 第5回 GPUのメモリ階層の詳細(様々なメモリの利用)
2015年度先端GPGPUシミュレーション工学特論 第5回 GPUのメモリ階層の詳細 (様々なメモリの利用) 智啓 出川
 

More from 智啓 出川 (20)

Fortranが拓く世界、VSCodeが架ける橋
Fortranが拓く世界、VSCodeが架ける橋Fortranが拓く世界、VSCodeが架ける橋
Fortranが拓く世界、VSCodeが架ける橋
 
Very helpful python code to find coefficients of the finite difference method
Very helpful python code to find coefficients of the finite difference methodVery helpful python code to find coefficients of the finite difference method
Very helpful python code to find coefficients of the finite difference method
 
Why do we confuse String and Array of Characters in Fortran?
Why do we confuse String and Array of Characters in Fortran?Why do we confuse String and Array of Characters in Fortran?
Why do we confuse String and Array of Characters in Fortran?
 
Pythonによる累乗近似
Pythonによる累乗近似Pythonによる累乗近似
Pythonによる累乗近似
 
数値計算結果のPythonによる後処理について(1次元データのピーク値およびその位置の推定)
数値計算結果のPythonによる後処理について(1次元データのピーク値およびその位置の推定)数値計算結果のPythonによる後処理について(1次元データのピーク値およびその位置の推定)
数値計算結果のPythonによる後処理について(1次元データのピーク値およびその位置の推定)
 
オブジェクト指向Fortranが拓く(はずだった)新しい世界
オブジェクト指向Fortranが拓く(はずだった)新しい世界オブジェクト指向Fortranが拓く(はずだった)新しい世界
オブジェクト指向Fortranが拓く(はずだった)新しい世界
 
Schematic diagrams of GPUs' architecture and Time evolution of theoretical FL...
Schematic diagrams of GPUs' architecture and Time evolution of theoretical FL...Schematic diagrams of GPUs' architecture and Time evolution of theoretical FL...
Schematic diagrams of GPUs' architecture and Time evolution of theoretical FL...
 
GPGPU Seminar (GPU Accelerated Libraries, 3 of 3, Thrust)
GPGPU Seminar (GPU Accelerated Libraries, 3 of 3, Thrust) GPGPU Seminar (GPU Accelerated Libraries, 3 of 3, Thrust)
GPGPU Seminar (GPU Accelerated Libraries, 3 of 3, Thrust)
 
GPGPU Seminar (GPU Accelerated Libraries, 2 of 3, cuSPARSE)
GPGPU Seminar (GPU Accelerated Libraries, 2 of 3, cuSPARSE) GPGPU Seminar (GPU Accelerated Libraries, 2 of 3, cuSPARSE)
GPGPU Seminar (GPU Accelerated Libraries, 2 of 3, cuSPARSE)
 
PGI CUDA FortranとGPU最適化ライブラリの一連携法
PGI CUDA FortranとGPU最適化ライブラリの一連携法PGI CUDA FortranとGPU最適化ライブラリの一連携法
PGI CUDA FortranとGPU最適化ライブラリの一連携法
 
教育機関でのJetsonの活用の可能性
教育機関でのJetsonの活用の可能性教育機関でのJetsonの活用の可能性
教育機関でのJetsonの活用の可能性
 
GPGPU Seminar (Accelerataion of Lattice Boltzmann Method using CUDA Fortran)
GPGPU Seminar (Accelerataion of Lattice Boltzmann Method using CUDA Fortran)GPGPU Seminar (Accelerataion of Lattice Boltzmann Method using CUDA Fortran)
GPGPU Seminar (Accelerataion of Lattice Boltzmann Method using CUDA Fortran)
 
GPGPU Seminar (PyCUDA)
GPGPU Seminar (PyCUDA)GPGPU Seminar (PyCUDA)
GPGPU Seminar (PyCUDA)
 
2015年度先端GPGPUシミュレーション工学特論 第13回 数値流体力学への応用 (高度な最適化)
2015年度先端GPGPUシミュレーション工学特論 第13回 数値流体力学への応用(高度な最適化)2015年度先端GPGPUシミュレーション工学特論 第13回 数値流体力学への応用(高度な最適化)
2015年度先端GPGPUシミュレーション工学特論 第13回 数値流体力学への応用 (高度な最適化)
 
2015年度先端GPGPUシミュレーション工学特論 第11回 数値流体力学への応用 (支配方程式,CPUプログラム)
2015年度先端GPGPUシミュレーション工学特論 第11回 数値流体力学への応用(支配方程式,CPUプログラム)2015年度先端GPGPUシミュレーション工学特論 第11回 数値流体力学への応用(支配方程式,CPUプログラム)
2015年度先端GPGPUシミュレーション工学特論 第11回 数値流体力学への応用 (支配方程式,CPUプログラム)
 
2015年度先端GPGPUシミュレーション工学特論 第10回 Poisson方程式の求解 (線形連立一次方程式)
2015年度先端GPGPUシミュレーション工学特論 第10回 Poisson方程式の求解(線形連立一次方程式)2015年度先端GPGPUシミュレーション工学特論 第10回 Poisson方程式の求解(線形連立一次方程式)
2015年度先端GPGPUシミュレーション工学特論 第10回 Poisson方程式の求解 (線形連立一次方程式)
 
2015年度先端GPGPUシミュレーション工学特論 第9回 偏微分方程式の差分計算 (移流方程式)
2015年度先端GPGPUシミュレーション工学特論 第9回 偏微分方程式の差分計算(移流方程式)2015年度先端GPGPUシミュレーション工学特論 第9回 偏微分方程式の差分計算(移流方程式)
2015年度先端GPGPUシミュレーション工学特論 第9回 偏微分方程式の差分計算 (移流方程式)
 
2015年度先端GPGPUシミュレーション工学特論 第8回 偏微分方程式の差分計算 (拡散方程式)
2015年度先端GPGPUシミュレーション工学特論 第8回 偏微分方程式の差分計算(拡散方程式)2015年度先端GPGPUシミュレーション工学特論 第8回 偏微分方程式の差分計算(拡散方程式)
2015年度先端GPGPUシミュレーション工学特論 第8回 偏微分方程式の差分計算 (拡散方程式)
 
2015年度先端GPGPUシミュレーション工学特論 第6回 プログラムの性能評価指針 (Flop/Byte,計算律速,メモリ律速)
2015年度先端GPGPUシミュレーション工学特論 第6回 プログラムの性能評価指針(Flop/Byte,計算律速,メモリ律速)2015年度先端GPGPUシミュレーション工学特論 第6回 プログラムの性能評価指針(Flop/Byte,計算律速,メモリ律速)
2015年度先端GPGPUシミュレーション工学特論 第6回 プログラムの性能評価指針 (Flop/Byte,計算律速,メモリ律速)
 
2015年度先端GPGPUシミュレーション工学特論 第5回 GPUのメモリ階層の詳細 (様々なメモリの利用)
2015年度先端GPGPUシミュレーション工学特論 第5回 GPUのメモリ階層の詳細(様々なメモリの利用)2015年度先端GPGPUシミュレーション工学特論 第5回 GPUのメモリ階層の詳細(様々なメモリの利用)
2015年度先端GPGPUシミュレーション工学特論 第5回 GPUのメモリ階層の詳細 (様々なメモリの利用)
 

2015年度先端GPGPUシミュレーション工学特論 第15回 CPUとGPUの協調