SlideShare una empresa de Scribd logo
1 de 92
Descargar para leer sin conexión
第8回 偏微分方程式の差分計算
(拡散方程式)
長岡技術科学大学 電気電子情報工学専攻 出川智啓
今日の内容
 シミュレーションの歴史と進歩
 差分法
 1階微分,2階微分に対する差分法
 1次関数の差分
 2次元拡散方程式
 付録
 共有メモリの典型的な使い方
先端GPGPUシミュレーション工学特論2 2015/06/04
数値計算
 計算機を利用して数学・物理学的問題の解を計算
 微積分を計算機で扱える形に変換
 処理自体はあまり複雑ではない
 精度を上げるために計算量が増加
先端GPGPUシミュレーション工学特論3 2015/06/04
シミュレーションの歴史と進歩
 自動車シミュレーションにおける例
 姫野龍太郎,次世代スーパーコンピュータとは そして,何が
できるようになるか
 http://accc.riken.jp/wp‐content/uploads/2015
/06/secure_4650_20100507kobe.pdf
 スライド6, 8
 1985年
 2次元でのシミュレーション
 実験結果と“傾向は”一致
 1987年
 3次元化し,実車に近い形状で計算
2015/06/04先端GPGPUシミュレーション工学特論4
シミュレーションの歴史と進歩
 自動車シミュレーションにおける例
 1988年~1990年
 車輪や床下も含めたモデル化
 1993年
 空気抵抗を誤差1%で予測可能
 空力解析以外にも利用
 1992年~1993年
 車体から発生する騒音のシミュレーション
 ドアミラーやピラーの形状の改良
 エンジンルームの冷却
 10mm以上の部品は全て含めて解析
2015/06/04先端GPGPUシミュレーション工学特論5
現象を支配する方程式(支配方程式)
 現象は微分方程式によって記述
 微分と積分が計算できれば現象を明らかにできる
 支配方程式
 場所や時間によって方程式は変わらない
 流体の支配方程式
0





i
i
x
u
t

j
ij
ij
iji
xx
p
x
uu
t
u










 
i
i
i
iji
i
i
i
i
x
q
x
u
x
pu
x
Eu
t
E













 
(質量保存式)
(エネルギ保存式)
(運動量保存式)
先端GPGPUシミュレーション工学特論13 2015/06/04
拡散方程式
 物質の拡散を表す方程式
 水の中に落ちたインクの拡散,金属中の熱伝導等
 時刻t=0におけるuの分布(初期値)が既知
 時間進行に伴い,uがどのように変化するかを計算
 時間積分しながらuの分布を求める
2
2
),(),(
x
txu
t
txu





先端GPGPUシミュレーション工学特論14 2015/06/04
2
2
2
2
),,(),,(),,(
y
tyxu
x
tyxu
t
tyxu








差分法
2015/06/04先端GPGPUシミュレーション工学特論15
 計算機で微分を計算する方法の一つ
 微分の定義
 xの関数uについて,xだけ離れた2点間の傾きを計算し,2
点の間隔を無限小に近づけたときの極限
 差分近似
 関数をある間隔でサンプリング
 その間隔xがuの変化に対して十分小さいと仮定
Δx
xuΔxxu
dx
du
Δx
)()(
lim
0



Δx
xuΔxxu
dx
du )()( 

差分法(理論的なお話)
2015/06/04先端GPGPUシミュレーション工学特論16
 差分の誤差
 limを排除したことでどの程度の誤差が入るのか
 関数uのテイラー展開を利用
Δx
xuΔxxu
Δx
xuΔxxu
dx
du
Δx
)()()()(
lim
0





 3
33
2
22
!3!2
)()(
dx
udΔx
dx
udΔx
dx
du
ΔxxuΔxxu










 3
33
2
22
!3!2
1)()(
dx
udΔx
dx
udΔx
ΔxΔx
xuΔxxu
dx
du
差分法(理論的なお話)
 空間打ち切り誤差
 定義とテイラー展開の比較
 テイラー展開を有限項で打ち切ったことによる誤差










 3
33
2
22
!3!2
1)()(
dx
udΔx
dx
udΔx
ΔxΔx
xuΔxxu
dx
du
Δx
xuΔxxu
Δx
xuΔxxu
dx
du
Δx
)()()()(
lim
0




 誤差








 3
32
2
2
!3!2 dx
udΔx
dx
udΔx
先端GPGPUシミュレーション工学特論17 2015/06/04
差分法(理論的なお話)
2015/06/04先端GPGPUシミュレーション工学特論18
 誤差の主要項
 空間打ち切り誤差の中で最も大きい誤差は第1項
 xは小さい→xの高次項はさらに小さく,無視できる
 直感的に導いた微分の数値計算法の誤差はO(x)
 xを1/10にすれば誤差も1/10になる
)(
!3!2 3
32
2
2
ΔxO
dx
udΔx
dx
udΔx









 
差分法(理論的なお話)
2015/06/04先端GPGPUシミュレーション工学特論19
 差分の取り方
 関数値の選び方にいくつか選択肢がある
 テイラー展開で整理
Δx
xuΔxxu
Δx
xuΔxxu
dx
du
Δx
)()()()(
lim
0





 3
33
2
22
!3!2
)()(
dx
udΔx
dx
udΔx
dx
du
ΔxxuΔxxu








 3
33
2
22
!3!2
1)()(
dx
udΔx
dx
udΔx
ΔxΔx
Δxxuxu
dx
du
差分法(理論的なお話)
2015/06/04先端GPGPUシミュレーション工学特論20
 差分の取り方
 テイラー展開で整理
Δx
ΔxxuΔxxu
Δx
ΔxxuΔxxu
dx
du
Δx 2
)()(
2
)()(
lim
0










 



Δx
Δxxuxu
Δx
xuΔxxu )()()()(
2
1








 3
33
!3
2
2
1
2
)()(
dx
udΔx
ΔxΔx
ΔxxuΔxxu
dx
du
差分法の概念図
2015/06/04先端GPGPUシミュレーション工学特論21
u(x)
x
x=0 ・・・ x−x x x+x
x
Δx
xuΔxxu )()( 
Δx
Δxxuxu )()( 
Δx
ΔxxuΔxxu
2
)()( 
中心差分
前進差分
後退差分
差分法の概念図
2015/06/04先端GPGPUシミュレーション工学特論22
u(x)
x
i=0 ・・・ i−1 i i+1
x=0 ・・・ (i−1)x ix (i+1)x
x
サンプリングされた関数値
を配列u[]で保持
差分法の概念図
2015/06/04先端GPGPUシミュレーション工学特論23
u[i]
i
i=0 ・・・ i−1           i i+1
dx
サンプリングされた関数値
を配列u[]で保持
u[i]
u[i‐1]
u[i+1]
中心差分
(u[i+1]‐u[i‐1])/(2*dx)
2階微分の離散化
 テイラー展開を応用
 x方向にx離れた2点で展開
 2式を足すと1階微分が消滅









 3
33
2
22
!3!2
)()(
x
uΔx
x
uΔx
x
u
ΔxxuΔxxu









 3
33
2
22
!3!2
)()(
x
uΔx
x
uΔx
x
u
ΔxxuΔxxu



 2
22
!2
2)(2)()(
x
uΔx
xuΔxxuΔxxu
先端GPGPUシミュレーション工学特論24 2015/06/04
2階微分の離散化
 2階微分の式に整理
22
2
)()(2)(
Δx
ΔxxuxuΔxxu
x
u 



先端GPGPUシミュレーション工学特論25 2015/06/04
u[i]
i
i=0 ・・・ i−1 i i+1
dx
サンプリングされた関数値
を配列u[]で保持
u[i]
u[i‐1]
u[i+1]
2階の中心差分
(u[i+1]‐2*u[i]+u[i‐1])/(dx*dx)
差分法の実装
 2階微分の中心差分近似
d2udx2[i]
u[i]
+ + + + + +
2015/06/04先端GPGPUシミュレーション工学特論26
2
11
22
2
2)()(2)(
Δx
uuu
Δx
ΔxxuxuΔxxu
dx
ud iii
x
 



2
1
Δx
+ +
差分法の実装
2015/06/04先端GPGPUシミュレーション工学特論27
 計算領域内部
 d2udx2[i]=(u[i‐1]‐2*u[i]+u[i+1])/dxdx;
 境界条件(関数値が無いため処理を変更)
 d2udx2[0  ]=(2*u[0  ]‐5*u[1  ]+4*u[2  ]‐u[3  ])/dxdx;
 d2udx2[N‐1]=(2*u[N‐1]‐5*u[N‐2]+4*u[N‐3]‐u[N‐4])/dxdx;
d2udx2[i]
u[i]
+ + + + +
2
1
Δx
+
差分法の実装
2015/06/04先端GPGPUシミュレーション工学特論28
 計算領域内部
 d2udx2[i]=(u[i‐1]‐2*u[i]+u[i+1])/dxdx;
 境界条件(関数値が無いため処理を変更)
 d2udx2[0  ]=(2*u[0  ]‐5*u[1  ]+4*u[2  ]‐u[3  ])/dxdx;
 d2udx2[N‐1]=(2*u[N‐1]‐5*u[N‐2]+4*u[N‐3]‐u[N‐4])/dxdx;
d2udx2[i]
u[i]
+
2
1
Δx
差分法の実装
2015/06/04先端GPGPUシミュレーション工学特論29
 計算領域内部
 d2udx2[i]=(u[i‐1]‐2*u[i]+u[i+1])/dxdx;
 境界条件(関数値が無いため処理を変更)
 d2udx2[0  ]=(2*u[0  ]‐5*u[1  ]+4*u[2  ]‐u[3  ])/dxdx;
 d2udx2[N‐1]=(2*u[N‐1]‐5*u[N‐2]+4*u[N‐3]‐u[N‐4])/dxdx;
d2udx2[i]
u[i]
2
1
Δx
+
#include<stdlib.h>
#include<math.h>/*‐lmオプションが必要*/
#define Lx (2.0*M_PI)
#define Nx (256)
#define dx (Lx/(Nx‐1))
#define Nbytes (Nx*sizeof(double))
#define dxdx (dx*dx)
void init(double *u){
int i;
for(i=0; i<Nx; i++){
u[i] = sin(i*dx);
}
}
void differentiate(double *u,
double *d2udx2){
int i;
d2udx2[0] = ( 2.0*u[0]
‐5.0*u[1]
+4.0*u[2]
‐ u[3])/dxdx;
for(i=1; i<Nx‐1; i++)
d2udx2[i] = (     u[i+1]
‐2.0*u[i ]
+    u[i‐1])/dxdx;
d2udx2[Nx‐1]=(‐ u[Nx‐4]
+4.0*u[Nx‐3]
‐5.0*u[Nx‐2]
+2.0*u[Nx‐1])/dxdx;
}
int main(void){
double *u,*d2udx2;
u      = (double *)malloc(Nbytes);
d2udx2 = (double *)malloc(Nbytes);
init(u);
differentiate(u,d2udx2);
return 0;
}
CPUプログラム
2015/06/04先端GPGPUシミュレーション工学特論30
differentiate.c
関数の離散化
2015/06/04先端GPGPUシミュレーション工学特論31
 計算領域の長さと離散点の数,離散点の間隔の関係
u(x)
x
x
0 2
Lx
0からLxの間に設けられた点の数Nx=Lx/x + 1
実行結果
2015/06/04先端GPGPUシミュレーション工学特論32
 
x
u,d2u/dx2
GPUへの移植
 計算領域内部を計算するスレッド
 d2udx2[i]=(u[i‐1]‐2*u[i]+u[i+1])/dxdx;
 境界を計算するスレッド
 d2udx2[0  ]=(2*u[0  ]‐5*u[1  ]+4*u[2  ]‐u[3  ])/dxdx;
 d2udx2[N‐1]=(2*u[N‐1]‐5*u[N‐2]+4*u[N‐3]‐u[N‐4])/dxdx;
2015/06/04先端GPGPUシミュレーション工学特論33
d2udx2[i]
u[i]
+ + + + + +
2
1
Δx
+ +
#include<stdio.h>
#include<stdlib.h>
#include<math.h>/*‐lmオプションが必要*/
#define Lx (2.0*M_PI)
#define Nx (256)
#define dx (Lx/(Nx‐1))
#define Nbytes (Nx*sizeof(double))
#define dxdx (dx*dx)
#define NT      (128)
#define NB      (Nx/NT)
void init(double *u){
int i;
for(i=0; i<Nx; i++){
u[i] = sin(i*dx);
}
}
__global__ void differentiate
(double *u, double *d2udx2){
int i = blockIdx.x*blockDim.x
+ threadIdx.x;
if(i==0)
d2udx2[i] = ( 2.0*u[i ]
‐5.0*u[i+1]
+4.0*u[i+2]
‐ u[i+3])/dxdx;
if(0<i && i<Nx‐1)
d2udx2[i] = (     u[i+1]
‐2.0*u[i ]
+    u[i‐1])/dxdx;
if(i==Nx‐1)
d2udx2[i]=(‐ u[i‐3]
+4.0*u[i‐2]
‐5.0*u[i‐1]
+2.0*u[i ])/dxdx;
}
GPUプログラム
2015/06/04先端GPGPUシミュレーション工学特論34
differentiate.cu
int main(void){
double *host_u,*host_d2udx2;
double *u,*d2udx2;
host_u =(double *)malloc(Nbytes);
cudaMalloc((void **)&u,Nbytes);
cudaMalloc((void **)&d2udx2,Nbytes);
init(host_u);
cudaMemcpy(u, host_u, Nbytes, cudaMemcpyHostToDevice);
differentiate<<<NB, NT>>>(u, d2udx2);
//host_d2udx2=(double *)malloc(Nbytes);
//cudaMemcpy(host_d2udx2, d2udx2, Nbytes, cudaMemcpyDeviceToHost);
//for(int i=0; i<Nx; i++)printf("%f,%f,%f¥n",i*dx,host_u[i],host_d2udx2[i]);
free(host_u);
free(host_d2udx2);
cudaFree(u);
cudaFree(d2udx2);
return 0;
}
GPUプログラム
2015/06/04先端GPGPUシミュレーション工学特論35
differentiate.cu
2次元への拡張
2015/06/04先端GPGPUシミュレーション工学特論36
 拡散方程式
 1次元
 2次元
2
2
),(),(
x
txu
t
txu





2
2
2
2
),,(),,(),,(
y
tyxu
x
tyxu
t
tyxu








differentiate.cuで計算
どのように2次元
に拡張するか
どのように離散化
するか
2次元への拡張
 x方向2階偏微分
 y方向を固定してx方向に偏微分
 y方向2階偏微分
 x方向を固定してy方向に偏微分
22
2
),(),(2),(
Δx
yΔxxuyxuyΔxxu
x
u 



22
2
),(),(2),(
Δy
ΔyyxuyxuΔyyxu
y
u 



先端GPGPUシミュレーション工学特論37 2015/06/04
時間積分
 時間微分項の離散化
 時間微分項を前進差分で離散化
 右辺のt+tの項を移行
t
tyxuttyxu
t
u




 ),,(),,(
先端GPGPUシミュレーション工学特論38 2015/06/04
u
t
u 2



t
u
ttyxuttyxu


 ),,(),,(
拡散方程式を代入
),,(),,(),,( 2
tyxuttyxuttyxu 
u(x, y, t)の2階微分を計算できればu(x, y, t+t)が求められる
離散化された方程式の記述
 簡略化した表現
 配列との対応をとるため下付き添字i, jを利用
 時間は,上付き添字nを利用
jiuyxu ,),( 
jiuyxxu ,1),( 
1,),(  jiuyyxu
n
jiutyxu ,),,( 
1
,),,( 
 n
jiuttyxu
先端GPGPUシミュレーション工学特論39 2015/06/04
離散化された拡散方程式
 連続系
 離散系
 t秒後の値
2
2
2
2
),,(),,(),,(
y
tyxu
x
tyxu
t
tyxu








2
1,,1,
2
,1,,1,
1
, 22
y
uuu
x
uuu
t
uu n
ji
n
ji
n
ji
n
ji
n
ji
n
ji
n
ji
n
ji







 














 
2
1,,1,
2
,1,,1
,
1
,
22
y
uuu
x
uuu
tuu
n
ji
n
ji
n
ji
n
ji
n
ji
n
jin
ji
n
ji
先端GPGPUシミュレーション工学特論40 2015/06/04
拡散方程式(熱伝導方程式)
x
y
i i+1i−1
j
j+1
j−1
x
y
x
y
x
y
t t+t
先端GPGPUシミュレーション工学特論41 2015/06/04













 
2
1,,1,
2
,1,,1
,
1
,
22
y
uuu
x
uuu
tuu
n
ji
n
ji
n
ji
n
ji
n
ji
n
jin
ji
n
ji
i i+1i−1
j
j+1
j−1
拡散方程式の安定性
2015/06/04先端GPGPUシミュレーション工学特論42
 プログラムを正しく作成しても正常な計算結果が得
られない場合がある
 安定条件
 拡散の強さを表す係数(拡散係数)を使った形
 二つの条件を満たすことが必要(結果が正しいかは別)
5.02



x
t
v 5.02



y
t
v













 
2
1,,1,
2
,1,,1
,
1
,
22
y
uuu
x
uuu
tuu
n
ji
n
ji
n
ji
n
ji
n
ji
n
jin
ji
n
ji 
計算手順
1. 計算条件の決定
 計算領域の大きさLx, Ly
 計算領域の分割数(離散点の個数)Nx, Ny
 離散点同士の間隔(格子間隔)x, y
 計算時間間隔t
2. 初期値の決定
 uの初期分布の決定
3. 差分値の計算
 uの分布からx, y方向の2階微分値を計算
 境界条件に基づいて境界の値を決定
 t秒後のuを計算
先端GPGPUシミュレーション工学特論43 2015/06/04
CPUプログラム
 計算条件の決定
 計算領域の大きさLx, Ly
 計算領域の分割数
(離散点の個数)Nx, Ny
 離散点同士の間隔
(格子間隔)x, y
 計算時間間隔t
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define Lx (2.0*M_PI)
#define Ly (2.0*M_PI)
#define Nx 512
#define Ny 512
#define dx (Lx/(Nx‐1))
#define dy (Ly/(Ny‐1))
#define dt 0.001
先端GPGPUシミュレーション工学特論44 2015/06/04
CPUプログラム
 初期条件
 境界条件
for(j=0;j<Ny;j++){
for(i=0;i<Nx;i++){
x = (double)i*dx;
y = (double)j*dy;
u[i*Ny+j]=sin(x)*sin(y);
}
}
先端GPGPUシミュレーション工学特論45 2015/06/04
yxu sinsin
2
2
0sinsin22
 yxu
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define Lx (2.0*M_PI)
#define Ly (2.0*M_PI)
#define Nx 128
#define Ny 128
#define dx (Lx/(Nx‐1))
#define dy (Ly/(Ny‐1))
#define dt 0.0001
#define endT (1.0)
#define Nt (int)(endT/dt)
#define DIFF (1.0)
#define dxdx (dx*dx)
#define dydy (dy*dy)
#define Nbytes (Nx*Ny*sizeof(double))
void laplacian(double *, double *);
void integrate(double *, double *, double *);
void update(double *, double *);
int main(void){
double *u,*unew,*ulap,x,y;
int i,j,ij,ip1,im1,jp1,jm1,n;
u    = (double *)malloc(Nx*Ny*sizeof(double));
unew = (double *)malloc(Nx*Ny*sizeof(double));
ulap = (double *)malloc(Nx*Ny*sizeof(double));
for(j=0;j<Ny;j++){
for(i=0;i<Nx;i++){
x = (double)i*dx;
y = (double)j*dy;
u[i*Ny+j]=sin(x)*sin(y);
unew[i*Ny+j]=0.0f;
ulap[i*Ny+j]=0.0f;
}
}
for(n=0;n<Nt;n++){
laplacian(u,ulap);
integrate(u,ulap,unew);
update(u,unew);
}
return 0;
}
CPUプログラム
2015/06/04先端GPGPUシミュレーション工学特論46
diffusion.c
void laplacian(double *u, double *ulap){
int i,j,ij,ip1,im1,jp1,jm1;
for(j=1;j<Ny‐1;j++){
for(i=1;i<Nx‐1;i++){
ij =  i *Ny+j;
ip1 = (i+1)*Ny+j;
im1 = (i‐1)*Ny+j;
jp1 =  i *Ny+j+1;
jm1 =  i *Ny+j‐1;
ulap[ij] =
(u[ip1]‐2.0*u[ij]+u[im1])/dxdx
+(u[jp1]‐2.0*u[ij]+u[jm1])/dydy;
}
}
}
void integrate
(double *u, double *ulap, double *unew){
int i,j,ij;
for(j=0;j<Ny;j++){
for(i=0;i<Nx;i++){
ij =  i*Ny+j;
unew[ij] = u[ij] + dt*DIFF*ulap[ij];
}
}
}
void update(double *u, double *unew){
int i,j,ij;
for(j=0;j<Ny;j++){
for(i=0;i<Nx;i++){
ij =  i*Ny+j;
u[ij] = unew[ij];
}
}
}
CPUプログラム
2015/06/04先端GPGPUシミュレーション工学特論47
diffusion.c
CPUプログラム
 差分計算
 x方向,y方向偏微分を個別に計算して加算
先端GPGPUシミュレーション工学特論48 2015/06/04
void laplacian(double *u, double *ulap){
int i,j,ij,ip1,im1,jp1,jm1;
for(j=1;j<Ny‐1;j++){
for(i=1;i<Nx‐1;i++){
ij =  i *Ny+j;
ip1 = (i+1)*Ny+j;
im1 = (i‐1)*Ny+j;
jp1 =  i *Ny+j+1;
jm1 =  i *Ny+j‐1;
ulap[ij] = (u[ip1]‐2.0*u[ij]+u[im1])/dxdx
+(u[jp1]‐2.0*u[ij]+u[jm1])/dydy;
}
}
}
ラプラシアン計算のメモリ参照
 ある1点i,jのラプラシアンを計算するために,周囲
5点のuを参照
先端GPGPUシミュレーション工学特論49 2015/06/04
u[] ulap[]
i−1 i i+1
j−1jj+1
ラプラシアン計算のメモリ参照
 ある1点i,jのラプラシアンを計算するために,周囲
5点のuを参照
先端GPGPUシミュレーション工学特論50 2015/06/04
u[] ulap[]
i−1 i i+1
j−1jj+1
ラプラシアン計算のメモリ参照
 ある1点i,jのラプラシアンを計算するために,周囲
5点のuを参照
先端GPGPUシミュレーション工学特論51 2015/06/04
u[] ulap[]
i−1 i i+1
j−1jj+1
ラプラシアン計算のメモリ参照
 ある1点i,jのラプラシアンを計算するために,周囲
5点のuを参照
先端GPGPUシミュレーション工学特論52 2015/06/04
u[] ulap[]
i−1 i i+1
j−1jj+1
ラプラシアン計算のメモリ参照
 ある1点i,jのラプラシアンを計算するために,周囲
5点のuを参照
 全てのuを参照し,領域内部のulapを計算
先端GPGPUシミュレーション工学特論53 2015/06/04
u[] ulap[]
CPUプログラム
 境界条件
 uのラプラシアン
 境界ではどの時刻においても0
 x=0, 0≤y≤2
 x=2, 0≤y≤2
 0≤x≤2, y=0
 0≤x≤2, y=2
 変数ulapを0で初期化すれば,計算しなくてもよい
先端GPGPUシミュレーション工学特論54 2015/06/04
yxu sinsin22
 ulap[]
CPUプログラム
 uの積分
先端GPGPUシミュレーション工学特論55 2015/06/04













 
2
1,,1,
2
,1,,1
,
1
,
22
y
uuu
x
uuu
tuu
n
ji
n
ji
n
ji
n
ji
n
ji
n
jin
ji
n
ji 
void integrate(double *u, double *ulap, double *unew){
int i,j,ij;
for(j=0;j<Ny;j++){
for(i=0;i<Nx;i++){
ij =  i*Ny+j;
unew[ij] = u[ij] + dt*DIFF*ulap[ij];
}
}
}
CPUプログラム
 uの更新
 unからun+1を計算
 un+1からun+2を計算
 今の時刻から次の時刻を求める
 求められた次の時刻を今の時刻と見なし,次の時刻を求める
先端GPGPUシミュレーション工学特論56 2015/06/04
同じアルゴリズム
void update(double *u, double *unew){
int i,j,ij;
for(j=0;j<Ny;j++){
for(i=0;i<Nx;i++){
ij =  i*Ny+j;
u[ij] = unew[ij];
}
}
}
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define Lx (2.0*M_PI)
#define Ly (2.0*M_PI)
#define Nx 128
#define Ny Nx
#define dx (Lx/(Nx‐1))
#define dy (Ly/(Ny‐1))
#define dt 0.00001
#define endT (1.0)
#define Nt (int)(endT/dt)
#define DIFF (1.0)
#define dxdx (dx*dx)
#define dydy (dy*dy)
#define Nbytes (Nx*Ny*sizeof(double))
#include "dif1.cu"
//#include "dif2.cu"
//#include "dif3.cu"
int main(void){
int n;    
double *dev_u,*dev_unew,*dev_ulap;
dim3 Thread, Block;
if(DIFF*dt/dxdx > 0.5){
printf("configuration error¥n");
exit(1);
}
cudaMalloc( (void**)&dev_u , Nbytes );
cudaMalloc( (void**)&dev_unew, Nbytes );
cudaMalloc( (void**)&dev_ulap, Nbytes );
Thread = dim3(THREADX,THREADY,1);
Block  = dim3(BLOCKX ,BLOCKY, 1);
init<<<Block, Thread>>>
(dev_u, dev_ulap, dev_unew);
for(n=0;n<Nt;n++){
laplacian<<<Block, Thread>>>
(dev_u,dev_ulap);
integrate<<<Block, Thread>>>
(dev_u,dev_ulap,dev_unew);
update<<<Block, Thread>>>(dev_u,dev_unew);
}
return 0;
}
GPUプログラム(CPU処理用共通部分)
2015/06/04先端GPGPUシミュレーション工学特論57
diff.cu
#define THREADX 1
#define THREADY 1
#define BLOCKX  1
#define BLOCKY  1
__global__ void init
(double *u, double *ulap, double *unew){
int i,j,ij;
double x,y;
for(j=0;j<Ny;j++){
for(i=0;i<Nx;i++){
ij =  i*Ny+j;
x = (double)i*dx;
y = (double)j*dy;
u[ij]=sin(x)*sin(y);
unew[ij]=0.0;
ulap[ij]=0.0;
}
}  
}
__global__ void laplacian(double *u, double *ulap){
int i,j,ij,ip1,im1,jp1,jm1;
for(j=1;j<Ny‐1;j++){
for(i=1;i<Nx‐1;i++){
ij =  i *Ny+j;
ip1 = (i+1)*Ny+j;
im1 = (i‐1)*Ny+j;
jp1 =  i *Ny+j+1;
jm1 =  i *Ny+j‐1;
ulap[ij] = (u[ip1]‐2.0f*u[ij]+u[im1])/dxdx
+(u[jp1]‐2.0f*u[ij]+u[jm1])/dydy;
}
}
}
__global__ void integrate
(double *u, double *ulap, double *unew){
int i,j,ij;
for(j=0;j<Ny;j++){
for(i=0;i<Nx;i++){
ij =  i *Ny+j;
unew[ij] = u[ij] + dt*DIFF*ulap[ij];
}
}
}
__global__ void update(double *u, double *unew){
int i,j,ij;
for(j=0;j<Ny;j++){
for(i=0;i<Nx;i++){
ij =  i *Ny+j;
u[ij] = unew[ij];
}
}
}
GPUプログラム(1スレッド版)
2015/06/04先端GPGPUシミュレーション工学特論58
dif1.cu
2次元ブロック分割
2015/06/04先端GPGPUシミュレーション工学特論59
 1スレッドが1点のラプラシアンを計算
blockIdx.x=0 blockIdx.x=1
blockIdx.y=0blockIdx.y=1
gridDim.x=2
gridDim.y=2
blockDim.x=4
blockDim.y=4
threadIdx.x=
threadIdx.y=
2次元ブロック分割
2015/06/04先端GPGPUシミュレーション工学特論60
 Nx=8, Ny=8, x,y方向スレッド数4,ブロック数2
 i = blockIdx.x*blockDim.x + threadIdx.x
 j = blockIdx.y*blockDim.y + threadIdx.y
(0,0)(1,0)(2,0)(3,0)(0,0)
(3,3) (3,3)
(0,1)(1,1)(2,1)(3,1)
(0,2)(1,2)(2,2)(3,2)
(0,3)(1,3)(2,3)(3,3) (3,3)
(0,0) (0,0)
block(0,0) block(1,0)
block(0,1) block(1,1)
threadIdx.x
threadIdx.y
i= 0 1 2 3 4 5 6 7
j=01234567
2次元的な配列アクセスの優先方向(CPU)
2015/06/04先端GPGPUシミュレーション工学特論61
 2次元配列の1次元配列的表現
for(i=0;i<Nx;i++)
for(j=0;j<Ny;j++)
out[i][j]=in[i][j];
in[],out[]
Nx
Ny
j
i
for(i=0;i<Nx;i++)
for(j=0;j<Ny;j++)
out[i*Ny+j]=
in[i*Ny+j];
2次元的な配列アクセスの優先方向(GPU)
2015/06/04先端GPGPUシミュレーション工学特論62
 CUDAで2次元的に並列化してアクセスする場合
i = blockIdx.x*blockDim.x
+ threadIdx.x;
j = blockIdx.y*blockDim.y
+ threadIdx.y;
out[j*Nx+i]=in[j*Nx+i];
in[],out[]
Nx
Ny
j
i
for(i=0;i<Nx;i++)
for(j=0;j<Ny;j++)
out[i*Ny+j]=
in[i*Ny+j];
threadIdx.x
threadIdx.y
#define THREADX 16
#define THREADY 16
#define BLOCKX  (Nx/THREADX)
#define BLOCKY  (Ny/THREADY)
__global__ void laplacian(double *u, double *ulap){
int i,j,ij,ip1,im1,jp1,jm1;
i = blockIdx.x*blockDim.x + threadIdx.x;
j = blockIdx.y*blockDim.y + threadIdx.y;
if( (0<i && i<Nx‐1) && (0<j && j<Ny‐1) ){
ij = i +Nx*j;
ip1 = i+1+Nx*j;
im1 = i‐1+Nx*j;
jp1 = i +Nx*(j+1);
jm1 = i +Nx*(j‐1);
ulap[ij] = (u[ip1]‐2.0*u[ij]+u[im1])/dxdx
+(u[jp1]‐2.0*u[ij]+u[jm1])/dydy;
}
}
__global__ void integrate
(double *u, double *ulap, double *unew){
int i,j,ij;
i = blockIdx.x*blockDim.x + threadIdx.x;
j = blockIdx.y*blockDim.y + threadIdx.y;
ij = i+Nx*j;
unew[ij] = u[ij] + dt*ulap[ij];
}
__global__ void update(double *u, double *unew){
int i,j,ij;
i = blockIdx.x*blockDim.x + threadIdx.x;
j = blockIdx.y*blockDim.y + threadIdx.y;
ij = i+Nx*j;
u[ij] = unew[ij];
}
__global__ void init
(double *u, double *ulap, double *unew){
int i,j,ij;
double x,y;
i = blockIdx.x*blockDim.x + threadIdx.x;
j = blockIdx.y*blockDim.y + threadIdx.y;
ij = i+Nx*j;
x = (double)i*dx;
y = (double)j*dy;
u[ij]=sin(x)*sin(y);
unew[ij]=0.0;
ulap[ij]=0.0;
}
GPUプログラム(1スレッドが1点を計算)
2015/06/04先端GPGPUシミュレーション工学特論63
dif2.cu
境界でラプラシアンが0にならない場合
 共有メモリを利用してキャッシュを模擬
 共有メモリに付加的な領域を追加
先端GPGPUシミュレーション工学特論64 2015/06/04
u[] ulap[]
境界でラプラシアンが0にならない場合
 共有メモリを利用してキャッシュを模擬
 共有メモリに付加的な領域を追加
先端GPGPUシミュレーション工学特論65 2015/06/04
u[] ulap[]
境界でラプラシアンが0にならない場合
 共有メモリを利用してキャッシュを模擬
 共有メモリに付加的な領域を追加
先端GPGPUシミュレーション工学特論66 2015/06/04
u[] ulap[]
su[][]
付加的な領域(袖領域)の取り扱い
 データがグローバルメモリに存在する場合は,グ
ローバルメモリから読み込み
先端GPGPUシミュレーション工学特論67 2015/06/04
u[] ulap[]
su[][]
付加的な領域(袖領域)の取り扱い
 グローバルメモリに無い場合は境界条件から決定
先端GPGPUシミュレーション工学特論68 2015/06/04
u[] ulap[]
su[][]
境界条件
2015/06/04先端GPGPUシミュレーション工学特論69
 2階微分が0
0
2
2
11
2
2




 
Δx
uuu
x
u iii
11 2 iii uuu 
11 2 jjj uuu 
0
2
2
11
2
2




 
Δy
uuu
y
u jjj
境界条件
2015/06/04先端GPGPUシミュレーション工学特論70
 2階微分を片側差分で計算
3211 464   jjjjj uuuuu 
2
11
2
321
2
2
2
452
Δy
uuu
Δy
uuuu
y
u
jjj
jjjj









2
11
2
321
2
2
2
452
Δx
uuu
Δx
uuuu
x
u
iii
iiii









3211 464   iiiii uuuuu 
境界での2階微分の差分近似
境界外側の値
境界外側の値
#define THREADX 16
#define THREADY 16
#define BLOCKX  (Nx/THREADX)
#define BLOCKY  (Ny/THREADY)
__global__ void laplacian(double *u, double *ulap){
int i,j,ij;
int tx,ty;
__shared__ float su[1+THREADX+1][1+THREADY+1];
i = blockIdx.x*blockDim.x + threadIdx.x;
j = blockIdx.y*blockDim.y + threadIdx.y;
tx = threadIdx.x + 1;
ty = threadIdx.y + 1;
ij = i+Nx*j;
su[ty][tx] = u[ij];
__syncthreads();
if(   blockIdx.x == 0
&& threadIdx.x == 0           )
su[ty][tx‐1] = 2.0*su[ty][tx] ‐ su[ty][tx+1];
if(    blockIdx.x != 0
&& threadIdx.x == 0           ) 
su[ty][tx‐1] = u[j*Nx+i‐1];
if(   blockIdx.x == gridDim.x‐1
&& threadIdx.x == blockDim.x‐1)
su[ty][tx+1] = 2.0*su[ty][tx] ‐ su[ty][tx‐1];
if(   blockIdx.x != gridDim.x‐1
&& threadIdx.x == blockDim.x‐1)
su[ty][tx+1] = u[j*Nx+i+1];
if(   blockIdx.y == 0
&& threadIdx.y == 0)
su[ty‐1][tx] = 2.0*su[ty][tx] ‐ su[ty+1][tx];
if(   blockIdx.y != 0
&& threadIdx.y == 0)                      
su[ty‐1][tx] = u[(j‐1)*Nx+i];
if(   blockIdx.y == gridDim.y‐1
&& threadIdx.y == blockDim.y‐1)
su[ty+1][tx] = 2.0*su[ty][tx] ‐ su[ty‐1][tx];
if(   blockIdx.y != gridDim.y‐1
&& threadIdx.y == blockDim.y‐1)
su[ty+1][tx] = u[(j+1)*Nx+i];
__syncthreads();
ulap[ij] = 
(su[ty  ][tx‐1]‐2.0*su[ty][tx]+su[ty  ][tx+1])/dxdx
+(su[ty‐1][tx  ]‐2.0*su[ty][tx]+su[ty+1][tx  ])/dydy;
}
GPUプログラム(ラプラシアンカーネル)
2015/06/04先端GPGPUシミュレーション工学特論71
dif3.cu
GPUプログラム(ラプラシアンカーネル)
2015/06/04先端GPGPUシミュレーション工学特論72
 ブロック内のスレッド数+袖領域分の共有メモ
リを確保
 袖領域があるために添字の対応が変化
 添字の対応を考えないと,必要なデータを袖領域に置い
てしまう
 __syncthreads()を呼んでスレッドを同期
 共有メモリにデータが正しく書き込まれた事を保証
__shared__ float su[1+THREADY+1][1+THREADX+1];
i = blockIdx.x*blockDim.x + threadIdx.x;
j = blockIdx.y*blockDim.y + threadIdx.y;
tx = threadIdx.x;
ty = threadIdx.y;  
ij = i+Nx*j;
su[ty][tx] = u[ij];
__syncthreads();
u[]
su[][]
threadIdx.x
threadIdx.y
GPUプログラム(ラプラシアンカーネル)
2015/06/04先端GPGPUシミュレーション工学特論73
 ブロック内のスレッド数+袖領域分の共有メモ
リを確保
 袖領域があるために添字の対応が変化
 添字の対応を考えないと,必要なデータを袖領域に置い
てしまう
 __syncthreads()を呼んでスレッドを同期
 共有メモリにデータが正しく書き込まれた事を保証
__shared__ float su[1+THREADY+1][1+THREADX+1];
i = blockIdx.x*blockDim.x + threadIdx.x;
j = blockIdx.y*blockDim.y + threadIdx.y;
tx = threadIdx.x + 1;
ty = threadIdx.y;  
ij = i+Nx*j;
su[ty][tx] = u[ij];
__syncthreads();
u[]
su[][]
+1
threadIdx.x
threadIdx.y
GPUプログラム(ラプラシアンカーネル)
2015/06/04先端GPGPUシミュレーション工学特論74
 ブロック内のスレッド数+袖領域分の共有メモ
リを確保
 袖領域があるために添字の対応が変化
 添字の対応を考えないと,必要なデータを袖領域に置い
てしまう
 __syncthreads()を呼んでスレッドを同期
 共有メモリにデータが正しく書き込まれた事を保証
__shared__ float su[1+THREADY+1][1+THREADX+1];
i = blockIdx.x*blockDim.x + threadIdx.x;
j = blockIdx.y*blockDim.y + threadIdx.y;
tx = threadIdx.x + 1;
ty = threadIdx.y + 1;  
ij = i+Nx*j;
su[ty][tx] = u[ij];
__syncthreads();
u[]
su[][]
+1+1
threadIdx.x
threadIdx.y
threadIdx.y
threadIdx.x
GPUプログラム(ラプラシアンカーネル)
2015/06/04先端GPGPUシミュレーション工学特論75
 袖領域の設定
 グローバルメモリにデータがある箇所はグロー
バルメモリから読み込み
 グローバルメモリにデータがない箇所は2階微
分が0になるように袖領域の値を決定
 ブロックが境界に接しているか否かで処理を切替
if(blockIdx.x == 0           && threadIdx.x == 0           ) su[ty][tx‐1] = 2.0*su[ty][tx] ‐ su[ty][tx+1];
if(blockIdx.x != 0           && threadIdx.x == 0           ) su[ty][tx‐1] = u[j*Nx+i‐1];
if(blockIdx.x == gridDim.x‐1 && threadIdx.x == blockDim.x‐1) su[ty][tx+1] = 2.0*su[ty][tx] ‐ su[ty][tx‐1];
if(blockIdx.x != gridDim.x‐1 && threadIdx.x == blockDim.x‐1) su[ty][tx+1] = u[j*Nx+i+1];
if(blockIdx.y == 0           && threadIdx.y == 0           ) su[ty‐1][tx] = 2.0*su[ty][tx] ‐ su[ty+1][tx];
if(blockIdx.y != 0           && threadIdx.y == 0           ) su[ty‐1][tx] = u[(j‐1)*Nx+i];
if(blockIdx.y == gridDim.y‐1 && threadIdx.y == blockDim.y‐1) su[ty+1][tx] = 2.0*su[ty][tx] ‐ su[ty‐1][tx];
if(blockIdx.y != gridDim.y‐1 && threadIdx.y == blockDim.y‐1) su[ty+1][tx] = u[(j+1)*Nx+i];
__syncthreads();
GPUプログラム(ラプラシアンカーネル)
2015/06/04先端GPGPUシミュレーション工学特論76
 共有メモリのデータを利用してラプラシアンを計算
 if分岐を排除
ulap[]
su[][]
ulap[ij] = (su[ty  ][tx‐1]‐2.0*su[ty][tx]+su[ty  ][tx+1])/dxdx
+(su[ty‐1][tx  ]‐2.0*su[ty][tx]+su[ty+1][tx  ])/dydy;
GPUプログラムの評価
2015/06/04先端GPGPUシミュレーション工学特論77
 共有メモリを使用したdif3.cu
 dif2.cu(共有メモリ不使用)より速いこともあれば遅いこ
ともある
 Fermi世代以降のGPUはキャッシュを搭載
 共有メモリを使っても速くならない
 共有メモリへ明示的にデータを移動
 余分な処理により負荷が増加
__global__ void update(double *u, double *unew){
int i,j,ij;
i = blockIdx.x*blockDim.x + threadIdx.x;
j = blockIdx.y*blockDim.y + threadIdx.y;
ij = i+Nx*j;
u[ij] = unew[ij];
}
その他の処理の高速化
2015/06/04先端GPGPUシミュレーション工学特論78
 値の更新
 unewのデータをuにコピーしているだけ
 cudaMemcpyで代用可能
その他の処理の高速化
2015/06/04先端GPGPUシミュレーション工学特論79
 値の更新
 unewのデータをuにコピーしているだけ
 cudaMemcpyで代用可能
for(n=0;n<Nt;n++){
laplacian<<<Block, Thread>>>(dev_u,dev_ulap);
integrate<<<Block, Thread>>>(dev_u,dev_ulap,dev_unew);
//update<<<Block, Thread>>>(dev_u,dev_unew);
cudaMemcpy(dev_u, dev_new, Nbytes, cudaMemcpyDeviceToDevice);
}
return 0;
その他の処理の高速化
2015/06/04先端GPGPUシミュレーション工学特論80
 初期値の計算
 三角関数がそれらしい値で求められればいい場合
 有効数字4桁程度
__global__ void init(double *u, double *ulap, double *unew){
int i,j,ij;
double x,y;
i = blockIdx.x*blockDim.x + threadIdx.x;
j = blockIdx.y*blockDim.y + threadIdx.y;
ij = i+Nx*j;
x = (double)i*dx;y = (double)j*dy;
u[ij]=sin(x)*sin(y);
unew[ij]=0.0;
ulap[ij]=0.0;
}
その他の処理の高速化
2015/06/04先端GPGPUシミュレーション工学特論81
 初期値の計算
 三角関数がそれらしい値で求められればいい場合
 有効数字4桁程度
__global__ void init(double *u, double *ulap, double *unew){
int i,j,ij;
double x,y;
i = blockIdx.x*blockDim.x + threadIdx.x;
j = blockIdx.y*blockDim.y + threadIdx.y;
ij = i+Nx*j;
x = (double)i*dx;y = (double)j*dy;
u[ij]=__sinf(x)*__sinf(y);
unew[ij]=0.0;
ulap[ij]=0.0;
}
FastMath関数
2015/06/04先端GPGPUシミュレーション工学特論82
 三角関数など数学関数を高速に計算
 精度は落ちる
 手動で書き換え
 __sinf
 __cosf
 __powfなど
 ‐use_fast_mathオプション
 sin,cosを利用していても,‐use‐fast‐mathオプションを
付けることで__sinf, __cosfに置き換えられる
付録
共有メモリの典型的な使い方
共有メモリの典型的な使い方
2015/06/04先端GPGPUシミュレーション工学特論84
 差分法
 あるスレッドが中心差分を計算するために配列の要素i‐1, 
i, i+1を参照
 配列要素は複数回参照される
 Fermi世代以降はキャッシュが利用可能
1 1 2 2 1 1
dudx[i]
u[i]
+ + + +
Δx2
1
参照される回数
共有メモリの典型的な使い方
 境界で異なる処理を行うためにif分岐が必要
 キャッシュを搭載していてもグローバルメモリへのアクセス
を伴うif分岐は高負荷
 データの再利用とif文の排除に共有メモリを利用
2 2 3 3 2 2
dudx[i]
u[i]
+ + + + + +
2015/06/04先端GPGPUシミュレーション工学特論85
Δx2
1
参照される回数
共有メモリによる明示的なキャッシュ
2015/06/04先端GPGPUシミュレーション工学特論86
 グローバルメモリから共有メモリにデータをキャッシュ
 共有メモリ上で境界条件を処理
 中心差分の計算からifを排除
dudx[i]
u[i]
共有メモリ
blockIdx.x=0 blockIdx.x=1
計算のために必要になる余分な領域(袖領域)
共有メモリによる明示的なキャッシュ
2015/06/04先端GPGPUシミュレーション工学特論87
 グローバルメモリから共有メモリにデータをキャッシュ
 共有メモリ上で境界条件を処理
 中心差分の計算からifを排除
dudx[i]
u[i]
共有メモリ
blockIdx.x=0 blockIdx.x=1
何らかの方法で
境界条件を反映
何らかの方法で
境界条件を反映
共有メモリによる明示的なキャッシュ
2015/06/04先端GPGPUシミュレーション工学特論88
 グローバルメモリから共有メモリにデータをキャッシュ
 共有メモリ上で境界条件を処理
 中心差分の計算からifを排除
dudx[i]
u[i]
共有メモリ
++ + + + +
blockIdx.x=0 blockIdx.x=1
全スレッドが同じ式
で中心差分を計算
#include<stdlib.h>
#include<math.h>/*‐lmオプションが必要*/
#define Lx (2.0*M_PI)
#define Nx (1024*1024)
#define dx (Lx/(Nx‐1))
#define Nbytes (Nx*sizeof(double))
#define NT (256)
#define NB (Nx/NT)
void init(double *u){
int i;
for(i=0; i<Nx; i++){
u[i] = sin(i*dx);
}
}
__global__ void differentiate
(double *u, double *dudx){
int i = blockIdx.x*blockDim.x
+ threadIdx.x;
if(i==0)
dudx[i]=(‐3.0*u[i ]
+4.0*u[i+1]
‐ u[i+2])/(2.0*dx);
if(0<i && i<Nx‐1)
dudx[i] = ( u[i+1]
‐u[i‐1])/(2.0*dx);
if(i==Nx‐1)
dudx[i]=(     u[i‐2]
‐4.0*u[i‐1]
+3.0*u[i ])/(2.0*dx);
}
GPUプログラム(単純な実装)
2015/06/04先端GPGPUシミュレーション工学特論89
differentiate1d.cu
int main(void){
double *host_u,*host_dudx;
double *u,*dudx;
host_u =(double *)malloc(Nbytes);
host_dudx=(double *)malloc(Nbytes);
cudaMalloc((void **)&u,Nbytes);
cudaMalloc((void **)&dudx,Nbytes);
init(host_u);
cudaMemcpy(u,host_u,Nbytes, 
cudaMemcpyHostToDevice);
differentiate<<<NB, NT>>>(u,dudx);
cudaMemcpy(host_dudx, dudx, Nbytes, 
cudaMemcpyDeviceToHost);
free(host_u);
free(host_dudx);
cudaFree(u);
cudaFree(dudx);
return 0;
}
GPUプログラム(単純な実装)
2015/06/04先端GPGPUシミュレーション工学特論90
differentiate1d.cu
__global__ void differentiate(double *u, double *dudx){
int i = blockIdx.x*blockDim.x + threadIdx.x;
__shared__ double su[1+NT+1];
int tx = threadIdx.x+1;
su[tx] = u[i];
__syncthreads();
if(blockIdx.x> 0           && threadIdx.x==0           ) su[tx‐1] = u[i‐1];
if(blockIdx.x< gridDim.x‐1 && threadIdx.x==blockDim.x‐1) su[tx+1] = u[i+1];
if(blockIdx.x==0           && threadIdx.x==0           )
su[tx‐1] = 3.0*su[tx]‐3.0*su[tx+1]+su[tx+2];
if(blockIdx.x==gridDim.x‐1 && threadIdx.x==blockDim.x‐1)
su[tx+1] = 3.0*su[tx]‐3.0*su[tx‐1]+su[tx‐2];
__syncthreads();
dudx[i] = ( su[tx+1]‐su[tx‐1])/(2.0*dx);
}
共有メモリを用いた書き換え
2015/06/04先端GPGPUシミュレーション工学特論91
differentiate1d_shared.cu
共有メモリの宣言と代入
int i = blockIdx.x*blockDim.x + threadIdx.x;
__shared__ double su[1+NT+1]; //右と左の袖領域を追加して宣言
int tx = threadIdx.x+1;
su[tx] = u[i];
__syncthreads();
2015/06/04先端GPGPUシミュレーション工学特論92
u[i]
su[NT+2]
i=   0    1    2            3    4    5
threadIdx.x= 0    1    2          0    1    2
tx=   0    1    2    3   4       0    1    2    3    4
NT=3NT=3
u[0] u[1] u[2]             u[3] u[4] u[5]
袖領域の処理
if(blockIdx.x> 0           && threadIdx.x==0           ) su[tx‐1] = u[i‐1];
if(blockIdx.x< gridDim.x‐1 && threadIdx.x==blockDim.x‐1) su[tx+1] = u[i+1];
2015/06/04先端GPGPUシミュレーション工学特論93
u[i]
su[NT+2]
i=   0    1    2            3    4    5
0    1    2=threadIdx.x
tx=   0    1    2    3   4       0    1    2    3    4
blockIdx.x=0 blockIdx.x=1
u[0] u[1] u[2]         u[3] u[4] u[5]
袖領域の処理
if(blockIdx.x> 0           && threadIdx.x==0           ) su[tx‐1] = u[i‐1];
if(blockIdx.x< gridDim.x‐1 && threadIdx.x==blockDim.x‐1) su[tx+1] = u[i+1];
2015/06/04先端GPGPUシミュレーション工学特論94
u[i]
su[NT+2]
i=   0    1    2            3    4    5
0=threadIdx.x
tx=   0    1    2    3   4       0    1    2    3    4
blockIdx.x=0 blockIdx.x=1
u[0] u[1] u[2]        u[2] u[3] u[4] u[5]
袖領域の処理
if(blockIdx.x> 0           && threadIdx.x==0           ) su[tx‐1] = u[i‐1];
if(blockIdx.x< gridDim.x‐1 && threadIdx.x==blockDim.x‐1) su[tx+1] = u[i+1];
2015/06/04先端GPGPUシミュレーション工学特論95
u[i]
su[NT+2]
i=   0    1    2            3    4    5
tx=   0    1    2    3   4       0    1    2    3    4
blockIdx.x=0 blockIdx.x=1
u[0] u[1] u[2] u[2] u[3] u[4] u[5]
threadIdx.x= 0    1    2
袖領域の処理
if(blockIdx.x> 0           && threadIdx.x==0           ) su[tx‐1] = u[i‐1];
if(blockIdx.x< gridDim.x‐1 && threadIdx.x==blockDim.x‐1) su[tx+1] = u[i+1];
2015/06/04先端GPGPUシミュレーション工学特論96
u[i]
su[NT+2]
i=   0    1    2            3    4    5
tx=   0    1    2    3   4       0    1    2    3    4
blockIdx.x=0 blockIdx.x=1
u[0] u[1] u[2] u[3] u[2] u[3] u[4] u[5]
threadIdx.x=2
境界条件の処理
if(blockIdx.x==0           && threadIdx.x==0           )
su[tx‐1] = 3.0*su[tx]‐3.0*su[tx+1]+su[tx+2];
if(blockIdx.x==gridDim.x‐1 && threadIdx.x==blockDim.x‐1)
su[tx+1] = 3.0*su[tx]‐3.0*su[tx‐1]+su[tx‐2];
2015/06/04先端GPGPUシミュレーション工学特論97
su[NT+2]
tx=   0    1    2    3   4       0    1    2    3    4
blockIdx.x=0 blockIdx.x=1
u[0] u[1] u[2] u[3] u[2] u[3] u[4] u[5]
2101 33 uuuu 
Δx
uu
Δx
uuu
dx
du
i 22
43 11210
0






境界での差分式と中心差分式が一致するようにu−1を決定
u[‐1]
境界条件の処理
if(blockIdx.x==0           && threadIdx.x==0           )
su[tx‐1] = 3.0*su[tx]‐3.0*su[tx+1]+su[tx+2];
if(blockIdx.x==gridDim.x‐1 && threadIdx.x==blockDim.x‐1)
su[tx+1] = 3.0*su[tx]‐3.0*su[tx‐1]+su[tx‐2];
2015/06/04先端GPGPUシミュレーション工学特論98
su[NT+2]
tx=   0    1    2    3   4       0    1    2    3    4
blockIdx.x=0 blockIdx.x=1
u[0] u[1] u[2] u[3] u[2] u[3] u[4] u[5]
321 33   NNNN uuuu
Δx
uu
Δx
uuu
dx
du NNNNN
Ni 22
43 2321
1






境界での差分式と中心差分式が一致するようにuNを決定
u[‐1] u[6]
中心差分の計算
__syncthreads();
dudx[i] = ( su[tx+1]‐su[tx‐1])/(2.0*dx);
2015/06/04先端GPGPUシミュレーション工学特論99
su[NT+2]
tx=   0    1    2    3   4       0    1    2    3    4
blockIdx.x=0 blockIdx.x=1
u[0] u[1] u[2] u[3] u[2] u[3] u[4] u[5]
dudx[i]
++ + + + + 全スレッドが同じ式
で中心差分を計算Δx2
1
u[‐1] u[6]

Más contenido relacionado

La actualidad más candente

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) 智啓 出川
 
2015年度先端GPGPUシミュレーション工学特論 第9回 偏微分方程式の差分計算 (移流方程式)
2015年度先端GPGPUシミュレーション工学特論 第9回 偏微分方程式の差分計算(移流方程式)2015年度先端GPGPUシミュレーション工学特論 第9回 偏微分方程式の差分計算(移流方程式)
2015年度先端GPGPUシミュレーション工学特論 第9回 偏微分方程式の差分計算 (移流方程式)智啓 出川
 
2015年度先端GPGPUシミュレーション工学特論 第3回 GPUプログラム構造の詳細 (threadとwarp)
2015年度先端GPGPUシミュレーション工学特論 第3回 GPUプログラム構造の詳細(threadとwarp)2015年度先端GPGPUシミュレーション工学特論 第3回 GPUプログラム構造の詳細(threadとwarp)
2015年度先端GPGPUシミュレーション工学特論 第3回 GPUプログラム構造の詳細 (threadとwarp)智啓 出川
 
2015年度先端GPGPUシミュレーション工学特論 第11回 数値流体力学への応用 (支配方程式,CPUプログラム)
2015年度先端GPGPUシミュレーション工学特論 第11回 数値流体力学への応用(支配方程式,CPUプログラム)2015年度先端GPGPUシミュレーション工学特論 第11回 数値流体力学への応用(支配方程式,CPUプログラム)
2015年度先端GPGPUシミュレーション工学特論 第11回 数値流体力学への応用 (支配方程式,CPUプログラム)智啓 出川
 
電子動力学アプリケーションの最適化2
電子動力学アプリケーションの最適化2電子動力学アプリケーションの最適化2
電子動力学アプリケーションの最適化2RCCSRENKEI
 
2015年度GPGPU実践プログラミング 第8回 総和計算(高度な最適化)
2015年度GPGPU実践プログラミング 第8回 総和計算(高度な最適化)2015年度GPGPU実践プログラミング 第8回 総和計算(高度な最適化)
2015年度GPGPU実践プログラミング 第8回 総和計算(高度な最適化)智啓 出川
 
DEEP LEARNING、トレーニング・インファレンスのGPUによる高速化
DEEP LEARNING、トレーニング・インファレンスのGPUによる高速化DEEP LEARNING、トレーニング・インファレンスのGPUによる高速化
DEEP LEARNING、トレーニング・インファレンスのGPUによる高速化RCCSRENKEI
 
2015年度GPGPU実践プログラミング 第6回 パフォーマンス解析ツール
2015年度GPGPU実践プログラミング 第6回 パフォーマンス解析ツール2015年度GPGPU実践プログラミング 第6回 パフォーマンス解析ツール
2015年度GPGPU実践プログラミング 第6回 パフォーマンス解析ツール智啓 出川
 
200625material naruse
200625material naruse200625material naruse
200625material naruseRCCSRENKEI
 
2015年度先端GPGPUシミュレーション工学特論 第6回 プログラムの性能評価指針 (Flop/Byte,計算律速,メモリ律速)
2015年度先端GPGPUシミュレーション工学特論 第6回 プログラムの性能評価指針(Flop/Byte,計算律速,メモリ律速)2015年度先端GPGPUシミュレーション工学特論 第6回 プログラムの性能評価指針(Flop/Byte,計算律速,メモリ律速)
2015年度先端GPGPUシミュレーション工学特論 第6回 プログラムの性能評価指針 (Flop/Byte,計算律速,メモリ律速)智啓 出川
 
第4回 配信講義 計算科学技術特論A (2021)
第4回 配信講義 計算科学技術特論A (2021)第4回 配信講義 計算科学技術特論A (2021)
第4回 配信講義 計算科学技術特論A (2021)RCCSRENKEI
 
第1回 配信講義 計算科学技術特論A (2021)
第1回 配信講義 計算科学技術特論A (2021)第1回 配信講義 計算科学技術特論A (2021)
第1回 配信講義 計算科学技術特論A (2021)RCCSRENKEI
 
アプリケーションの性能最適化2(CPU単体性能最適化)
アプリケーションの性能最適化2(CPU単体性能最適化)アプリケーションの性能最適化2(CPU単体性能最適化)
アプリケーションの性能最適化2(CPU単体性能最適化)RCCSRENKEI
 
2015年度先端GPGPUシミュレーション工学特論 第15回 CPUとGPUの協調
2015年度先端GPGPUシミュレーション工学特論 第15回 CPUとGPUの協調2015年度先端GPGPUシミュレーション工学特論 第15回 CPUとGPUの協調
2015年度先端GPGPUシミュレーション工学特論 第15回 CPUとGPUの協調智啓 出川
 
アプリケーションの性能最適化の実例1
アプリケーションの性能最適化の実例1 アプリケーションの性能最適化の実例1
アプリケーションの性能最適化の実例1 RCCSRENKEI
 
200730material fujita
200730material fujita200730material fujita
200730material fujitaRCCSRENKEI
 
200514material minami
200514material minami200514material minami
200514material minamiRCCSRENKEI
 
第5回 配信講義 計算科学技術特論A(2021)
第5回 配信講義 計算科学技術特論A(2021)第5回 配信講義 計算科学技術特論A(2021)
第5回 配信講義 計算科学技術特論A(2021)RCCSRENKEI
 
Anaconda & NumbaPro 使ってみた
Anaconda & NumbaPro 使ってみたAnaconda & NumbaPro 使ってみた
Anaconda & NumbaPro 使ってみたYosuke Onoue
 

La actualidad más candente (20)

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)
 
2015年度先端GPGPUシミュレーション工学特論 第9回 偏微分方程式の差分計算 (移流方程式)
2015年度先端GPGPUシミュレーション工学特論 第9回 偏微分方程式の差分計算(移流方程式)2015年度先端GPGPUシミュレーション工学特論 第9回 偏微分方程式の差分計算(移流方程式)
2015年度先端GPGPUシミュレーション工学特論 第9回 偏微分方程式の差分計算 (移流方程式)
 
2015年度先端GPGPUシミュレーション工学特論 第3回 GPUプログラム構造の詳細 (threadとwarp)
2015年度先端GPGPUシミュレーション工学特論 第3回 GPUプログラム構造の詳細(threadとwarp)2015年度先端GPGPUシミュレーション工学特論 第3回 GPUプログラム構造の詳細(threadとwarp)
2015年度先端GPGPUシミュレーション工学特論 第3回 GPUプログラム構造の詳細 (threadとwarp)
 
2015年度先端GPGPUシミュレーション工学特論 第11回 数値流体力学への応用 (支配方程式,CPUプログラム)
2015年度先端GPGPUシミュレーション工学特論 第11回 数値流体力学への応用(支配方程式,CPUプログラム)2015年度先端GPGPUシミュレーション工学特論 第11回 数値流体力学への応用(支配方程式,CPUプログラム)
2015年度先端GPGPUシミュレーション工学特論 第11回 数値流体力学への応用 (支配方程式,CPUプログラム)
 
電子動力学アプリケーションの最適化2
電子動力学アプリケーションの最適化2電子動力学アプリケーションの最適化2
電子動力学アプリケーションの最適化2
 
2015年度GPGPU実践プログラミング 第8回 総和計算(高度な最適化)
2015年度GPGPU実践プログラミング 第8回 総和計算(高度な最適化)2015年度GPGPU実践プログラミング 第8回 総和計算(高度な最適化)
2015年度GPGPU実践プログラミング 第8回 総和計算(高度な最適化)
 
DEEP LEARNING、トレーニング・インファレンスのGPUによる高速化
DEEP LEARNING、トレーニング・インファレンスのGPUによる高速化DEEP LEARNING、トレーニング・インファレンスのGPUによる高速化
DEEP LEARNING、トレーニング・インファレンスのGPUによる高速化
 
2015年度GPGPU実践プログラミング 第6回 パフォーマンス解析ツール
2015年度GPGPU実践プログラミング 第6回 パフォーマンス解析ツール2015年度GPGPU実践プログラミング 第6回 パフォーマンス解析ツール
2015年度GPGPU実践プログラミング 第6回 パフォーマンス解析ツール
 
200625material naruse
200625material naruse200625material naruse
200625material naruse
 
2015年度先端GPGPUシミュレーション工学特論 第6回 プログラムの性能評価指針 (Flop/Byte,計算律速,メモリ律速)
2015年度先端GPGPUシミュレーション工学特論 第6回 プログラムの性能評価指針(Flop/Byte,計算律速,メモリ律速)2015年度先端GPGPUシミュレーション工学特論 第6回 プログラムの性能評価指針(Flop/Byte,計算律速,メモリ律速)
2015年度先端GPGPUシミュレーション工学特論 第6回 プログラムの性能評価指針 (Flop/Byte,計算律速,メモリ律速)
 
第4回 配信講義 計算科学技術特論A (2021)
第4回 配信講義 計算科学技術特論A (2021)第4回 配信講義 計算科学技術特論A (2021)
第4回 配信講義 計算科学技術特論A (2021)
 
第1回 配信講義 計算科学技術特論A (2021)
第1回 配信講義 計算科学技術特論A (2021)第1回 配信講義 計算科学技術特論A (2021)
第1回 配信講義 計算科学技術特論A (2021)
 
アプリケーションの性能最適化2(CPU単体性能最適化)
アプリケーションの性能最適化2(CPU単体性能最適化)アプリケーションの性能最適化2(CPU単体性能最適化)
アプリケーションの性能最適化2(CPU単体性能最適化)
 
2015年度先端GPGPUシミュレーション工学特論 第15回 CPUとGPUの協調
2015年度先端GPGPUシミュレーション工学特論 第15回 CPUとGPUの協調2015年度先端GPGPUシミュレーション工学特論 第15回 CPUとGPUの協調
2015年度先端GPGPUシミュレーション工学特論 第15回 CPUとGPUの協調
 
アプリケーションの性能最適化の実例1
アプリケーションの性能最適化の実例1 アプリケーションの性能最適化の実例1
アプリケーションの性能最適化の実例1
 
200730material fujita
200730material fujita200730material fujita
200730material fujita
 
200514material minami
200514material minami200514material minami
200514material minami
 
第5回 配信講義 計算科学技術特論A(2021)
第5回 配信講義 計算科学技術特論A(2021)第5回 配信講義 計算科学技術特論A(2021)
第5回 配信講義 計算科学技術特論A(2021)
 
Anaconda & NumbaPro 使ってみた
Anaconda & NumbaPro 使ってみたAnaconda & NumbaPro 使ってみた
Anaconda & NumbaPro 使ってみた
 

Destacado

2015年度先端GPGPUシミュレーション工学特論 第4回 GPUのメモリ階層の詳細 (共有メモリ)
2015年度先端GPGPUシミュレーション工学特論 第4回 GPUのメモリ階層の詳細(共有メモリ)2015年度先端GPGPUシミュレーション工学特論 第4回 GPUのメモリ階層の詳細(共有メモリ)
2015年度先端GPGPUシミュレーション工学特論 第4回 GPUのメモリ階層の詳細 (共有メモリ)智啓 出川
 
2015年度先端GPGPUシミュレーション工学特論 第1回補足 GPGPU教育計算機システムGROUSEの利用方法
2015年度先端GPGPUシミュレーション工学特論 第1回補足 GPGPU教育計算機システムGROUSEの利用方法2015年度先端GPGPUシミュレーション工学特論 第1回補足 GPGPU教育計算機システムGROUSEの利用方法
2015年度先端GPGPUシミュレーション工学特論 第1回補足 GPGPU教育計算機システムGROUSEの利用方法智啓 出川
 
2015年度GPGPU実践基礎工学 第7回 シングルコアとマルチコア
2015年度GPGPU実践基礎工学 第7回 シングルコアとマルチコア2015年度GPGPU実践基礎工学 第7回 シングルコアとマルチコア
2015年度GPGPU実践基礎工学 第7回 シングルコアとマルチコア智啓 出川
 
2015年度先端GPGPUシミュレーション工学特論 第2回 GPUによる並列計算の概念と メモリアクセス
2015年度先端GPGPUシミュレーション工学特論 第2回 GPUによる並列計算の概念とメモリアクセス2015年度先端GPGPUシミュレーション工学特論 第2回 GPUによる並列計算の概念とメモリアクセス
2015年度先端GPGPUシミュレーション工学特論 第2回 GPUによる並列計算の概念と メモリアクセス智啓 出川
 
2015年度先端GPGPUシミュレーション工学特論 第1回 先端シミュレーションおよび産業界におけるGPUの役割
2015年度先端GPGPUシミュレーション工学特論 第1回 先端シミュレーションおよび産業界におけるGPUの役割2015年度先端GPGPUシミュレーション工学特論 第1回 先端シミュレーションおよび産業界におけるGPUの役割
2015年度先端GPGPUシミュレーション工学特論 第1回 先端シミュレーションおよび産業界におけるGPUの役割智啓 出川
 
2015年度GPGPU実践基礎工学 第6回 ソフトウェアによるCPUの高速化技術
2015年度GPGPU実践基礎工学 第6回 ソフトウェアによるCPUの高速化技術2015年度GPGPU実践基礎工学 第6回 ソフトウェアによるCPUの高速化技術
2015年度GPGPU実践基礎工学 第6回 ソフトウェアによるCPUの高速化技術智啓 出川
 
2015年度GPGPU実践基礎工学 第12回 GPUによる画像処理
2015年度GPGPU実践基礎工学 第12回 GPUによる画像処理2015年度GPGPU実践基礎工学 第12回 GPUによる画像処理
2015年度GPGPU実践基礎工学 第12回 GPUによる画像処理智啓 出川
 
2015年度GPGPU実践基礎工学 第9回補足 GROUSEの利用方法
2015年度GPGPU実践基礎工学 第9回補足 GROUSEの利用方法2015年度GPGPU実践基礎工学 第9回補足 GROUSEの利用方法
2015年度GPGPU実践基礎工学 第9回補足 GROUSEの利用方法智啓 出川
 
2015年度GPGPU実践基礎工学 第13回 GPUのメモリ階層
2015年度GPGPU実践基礎工学 第13回 GPUのメモリ階層2015年度GPGPU実践基礎工学 第13回 GPUのメモリ階層
2015年度GPGPU実践基礎工学 第13回 GPUのメモリ階層智啓 出川
 
2015年度GPGPU実践基礎工学 第8回 並列計算の概念 (プロセスとスレッド)
2015年度GPGPU実践基礎工学 第8回 並列計算の概念(プロセスとスレッド)2015年度GPGPU実践基礎工学 第8回 並列計算の概念(プロセスとスレッド)
2015年度GPGPU実践基礎工学 第8回 並列計算の概念 (プロセスとスレッド)智啓 出川
 
2015年度先端GPGPUシミュレーション工学特論 第5回 GPUのメモリ階層の詳細 (様々なメモリの利用)
2015年度先端GPGPUシミュレーション工学特論 第5回 GPUのメモリ階層の詳細(様々なメモリの利用)2015年度先端GPGPUシミュレーション工学特論 第5回 GPUのメモリ階層の詳細(様々なメモリの利用)
2015年度先端GPGPUシミュレーション工学特論 第5回 GPUのメモリ階層の詳細 (様々なメモリの利用) 智啓 出川
 
2015年度GPGPU実践基礎工学 第9回 GPUのアーキテクチャ
2015年度GPGPU実践基礎工学 第9回 GPUのアーキテクチャ2015年度GPGPU実践基礎工学 第9回 GPUのアーキテクチャ
2015年度GPGPU実践基礎工学 第9回 GPUのアーキテクチャ智啓 出川
 
2015年度GPGPU実践基礎工学 第11回 GPUでの並列 プログラミング(ベクトル和)
2015年度GPGPU実践基礎工学 第11回 GPUでの並列プログラミング(ベクトル和)2015年度GPGPU実践基礎工学 第11回 GPUでの並列プログラミング(ベクトル和)
2015年度GPGPU実践基礎工学 第11回 GPUでの並列 プログラミング(ベクトル和)智啓 出川
 
2015年度GPGPU実践基礎工学 第15回 GPGPU開発環境 (OpenCL)
2015年度GPGPU実践基礎工学 第15回 GPGPU開発環境(OpenCL)2015年度GPGPU実践基礎工学 第15回 GPGPU開発環境(OpenCL)
2015年度GPGPU実践基礎工学 第15回 GPGPU開発環境 (OpenCL)智啓 出川
 
2015年度GPGPU実践基礎工学 第14回 GPGPU組込開発環境
2015年度GPGPU実践基礎工学 第14回 GPGPU組込開発環境2015年度GPGPU実践基礎工学 第14回 GPGPU組込開発環境
2015年度GPGPU実践基礎工学 第14回 GPGPU組込開発環境智啓 出川
 
2015年度GPGPU実践基礎工学 第10回 GPUのプログラム構造
2015年度GPGPU実践基礎工学 第10回 GPUのプログラム構造2015年度GPGPU実践基礎工学 第10回 GPUのプログラム構造
2015年度GPGPU実践基礎工学 第10回 GPUのプログラム構造智啓 出川
 
気候モデル放射カーネルのGPUへの移植と高速化
気候モデル放射カーネルのGPUへの移植と高速化気候モデル放射カーネルのGPUへの移植と高速化
気候モデル放射カーネルのGPUへの移植と高速化Takateru Yamagishi
 
2015年度先端GPGPUシミュレーション工学特論 第14回 複数GPUの利用
2015年度先端GPGPUシミュレーション工学特論 第14回 複数GPUの利用2015年度先端GPGPUシミュレーション工学特論 第14回 複数GPUの利用
2015年度先端GPGPUシミュレーション工学特論 第14回 複数GPUの利用智啓 出川
 
2015年度GPGPU実践基礎工学 第4回 CPUのアーキテクチャ
2015年度GPGPU実践基礎工学 第4回 CPUのアーキテクチャ2015年度GPGPU実践基礎工学 第4回 CPUのアーキテクチャ
2015年度GPGPU実践基礎工学 第4回 CPUのアーキテクチャ智啓 出川
 
2015年度GPGPU実践プログラミング 第11回 画像処理
2015年度GPGPU実践プログラミング 第11回 画像処理2015年度GPGPU実践プログラミング 第11回 画像処理
2015年度GPGPU実践プログラミング 第11回 画像処理智啓 出川
 

Destacado (20)

2015年度先端GPGPUシミュレーション工学特論 第4回 GPUのメモリ階層の詳細 (共有メモリ)
2015年度先端GPGPUシミュレーション工学特論 第4回 GPUのメモリ階層の詳細(共有メモリ)2015年度先端GPGPUシミュレーション工学特論 第4回 GPUのメモリ階層の詳細(共有メモリ)
2015年度先端GPGPUシミュレーション工学特論 第4回 GPUのメモリ階層の詳細 (共有メモリ)
 
2015年度先端GPGPUシミュレーション工学特論 第1回補足 GPGPU教育計算機システムGROUSEの利用方法
2015年度先端GPGPUシミュレーション工学特論 第1回補足 GPGPU教育計算機システムGROUSEの利用方法2015年度先端GPGPUシミュレーション工学特論 第1回補足 GPGPU教育計算機システムGROUSEの利用方法
2015年度先端GPGPUシミュレーション工学特論 第1回補足 GPGPU教育計算機システムGROUSEの利用方法
 
2015年度GPGPU実践基礎工学 第7回 シングルコアとマルチコア
2015年度GPGPU実践基礎工学 第7回 シングルコアとマルチコア2015年度GPGPU実践基礎工学 第7回 シングルコアとマルチコア
2015年度GPGPU実践基礎工学 第7回 シングルコアとマルチコア
 
2015年度先端GPGPUシミュレーション工学特論 第2回 GPUによる並列計算の概念と メモリアクセス
2015年度先端GPGPUシミュレーション工学特論 第2回 GPUによる並列計算の概念とメモリアクセス2015年度先端GPGPUシミュレーション工学特論 第2回 GPUによる並列計算の概念とメモリアクセス
2015年度先端GPGPUシミュレーション工学特論 第2回 GPUによる並列計算の概念と メモリアクセス
 
2015年度先端GPGPUシミュレーション工学特論 第1回 先端シミュレーションおよび産業界におけるGPUの役割
2015年度先端GPGPUシミュレーション工学特論 第1回 先端シミュレーションおよび産業界におけるGPUの役割2015年度先端GPGPUシミュレーション工学特論 第1回 先端シミュレーションおよび産業界におけるGPUの役割
2015年度先端GPGPUシミュレーション工学特論 第1回 先端シミュレーションおよび産業界におけるGPUの役割
 
2015年度GPGPU実践基礎工学 第6回 ソフトウェアによるCPUの高速化技術
2015年度GPGPU実践基礎工学 第6回 ソフトウェアによるCPUの高速化技術2015年度GPGPU実践基礎工学 第6回 ソフトウェアによるCPUの高速化技術
2015年度GPGPU実践基礎工学 第6回 ソフトウェアによるCPUの高速化技術
 
2015年度GPGPU実践基礎工学 第12回 GPUによる画像処理
2015年度GPGPU実践基礎工学 第12回 GPUによる画像処理2015年度GPGPU実践基礎工学 第12回 GPUによる画像処理
2015年度GPGPU実践基礎工学 第12回 GPUによる画像処理
 
2015年度GPGPU実践基礎工学 第9回補足 GROUSEの利用方法
2015年度GPGPU実践基礎工学 第9回補足 GROUSEの利用方法2015年度GPGPU実践基礎工学 第9回補足 GROUSEの利用方法
2015年度GPGPU実践基礎工学 第9回補足 GROUSEの利用方法
 
2015年度GPGPU実践基礎工学 第13回 GPUのメモリ階層
2015年度GPGPU実践基礎工学 第13回 GPUのメモリ階層2015年度GPGPU実践基礎工学 第13回 GPUのメモリ階層
2015年度GPGPU実践基礎工学 第13回 GPUのメモリ階層
 
2015年度GPGPU実践基礎工学 第8回 並列計算の概念 (プロセスとスレッド)
2015年度GPGPU実践基礎工学 第8回 並列計算の概念(プロセスとスレッド)2015年度GPGPU実践基礎工学 第8回 並列計算の概念(プロセスとスレッド)
2015年度GPGPU実践基礎工学 第8回 並列計算の概念 (プロセスとスレッド)
 
2015年度先端GPGPUシミュレーション工学特論 第5回 GPUのメモリ階層の詳細 (様々なメモリの利用)
2015年度先端GPGPUシミュレーション工学特論 第5回 GPUのメモリ階層の詳細(様々なメモリの利用)2015年度先端GPGPUシミュレーション工学特論 第5回 GPUのメモリ階層の詳細(様々なメモリの利用)
2015年度先端GPGPUシミュレーション工学特論 第5回 GPUのメモリ階層の詳細 (様々なメモリの利用)
 
2015年度GPGPU実践基礎工学 第9回 GPUのアーキテクチャ
2015年度GPGPU実践基礎工学 第9回 GPUのアーキテクチャ2015年度GPGPU実践基礎工学 第9回 GPUのアーキテクチャ
2015年度GPGPU実践基礎工学 第9回 GPUのアーキテクチャ
 
2015年度GPGPU実践基礎工学 第11回 GPUでの並列 プログラミング(ベクトル和)
2015年度GPGPU実践基礎工学 第11回 GPUでの並列プログラミング(ベクトル和)2015年度GPGPU実践基礎工学 第11回 GPUでの並列プログラミング(ベクトル和)
2015年度GPGPU実践基礎工学 第11回 GPUでの並列 プログラミング(ベクトル和)
 
2015年度GPGPU実践基礎工学 第15回 GPGPU開発環境 (OpenCL)
2015年度GPGPU実践基礎工学 第15回 GPGPU開発環境(OpenCL)2015年度GPGPU実践基礎工学 第15回 GPGPU開発環境(OpenCL)
2015年度GPGPU実践基礎工学 第15回 GPGPU開発環境 (OpenCL)
 
2015年度GPGPU実践基礎工学 第14回 GPGPU組込開発環境
2015年度GPGPU実践基礎工学 第14回 GPGPU組込開発環境2015年度GPGPU実践基礎工学 第14回 GPGPU組込開発環境
2015年度GPGPU実践基礎工学 第14回 GPGPU組込開発環境
 
2015年度GPGPU実践基礎工学 第10回 GPUのプログラム構造
2015年度GPGPU実践基礎工学 第10回 GPUのプログラム構造2015年度GPGPU実践基礎工学 第10回 GPUのプログラム構造
2015年度GPGPU実践基礎工学 第10回 GPUのプログラム構造
 
気候モデル放射カーネルのGPUへの移植と高速化
気候モデル放射カーネルのGPUへの移植と高速化気候モデル放射カーネルのGPUへの移植と高速化
気候モデル放射カーネルのGPUへの移植と高速化
 
2015年度先端GPGPUシミュレーション工学特論 第14回 複数GPUの利用
2015年度先端GPGPUシミュレーション工学特論 第14回 複数GPUの利用2015年度先端GPGPUシミュレーション工学特論 第14回 複数GPUの利用
2015年度先端GPGPUシミュレーション工学特論 第14回 複数GPUの利用
 
2015年度GPGPU実践基礎工学 第4回 CPUのアーキテクチャ
2015年度GPGPU実践基礎工学 第4回 CPUのアーキテクチャ2015年度GPGPU実践基礎工学 第4回 CPUのアーキテクチャ
2015年度GPGPU実践基礎工学 第4回 CPUのアーキテクチャ
 
2015年度GPGPU実践プログラミング 第11回 画像処理
2015年度GPGPU実践プログラミング 第11回 画像処理2015年度GPGPU実践プログラミング 第11回 画像処理
2015年度GPGPU実践プログラミング 第11回 画像処理
 

Similar a 2015年度先端GPGPUシミュレーション工学特論 第8回 偏微分方程式の差分計算 (拡散方程式)

QGISプログラミング入門 FOSS4G 2013 Tokyo
QGISプログラミング入門 FOSS4G 2013 TokyoQGISプログラミング入門 FOSS4G 2013 Tokyo
QGISプログラミング入門 FOSS4G 2013 TokyoKosuke Asahi
 
Kantocv 2-1-calibration publish
Kantocv 2-1-calibration publishKantocv 2-1-calibration publish
Kantocv 2-1-calibration publishtomoaki0705
 
各言語の k-means 比較
各言語の k-means 比較各言語の k-means 比較
各言語の k-means 比較y-uti
 
DS Exercise Course 3
DS Exercise Course 3DS Exercise Course 3
DS Exercise Course 3大貴 末廣
 
pg_hint_planを知る(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_hint_planを知る(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)pg_hint_planを知る(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_hint_planを知る(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)NTT DATA Technology & Innovation
 
2015年9月18日 (GTC Japan 2015) 深層学習フレームワークChainerの導入と化合物活性予測への応用
2015年9月18日 (GTC Japan 2015) 深層学習フレームワークChainerの導入と化合物活性予測への応用 2015年9月18日 (GTC Japan 2015) 深層学習フレームワークChainerの導入と化合物活性予測への応用
2015年9月18日 (GTC Japan 2015) 深層学習フレームワークChainerの導入と化合物活性予測への応用 Kenta Oono
 
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013Ryo Sakamoto
 
準同型暗号の実装とMontgomery, Karatsuba, FFT の性能
準同型暗号の実装とMontgomery, Karatsuba, FFT の性能準同型暗号の実装とMontgomery, Karatsuba, FFT の性能
準同型暗号の実装とMontgomery, Karatsuba, FFT の性能MITSUNARI Shigeo
 
GraphX によるグラフ分析処理の実例と入門
GraphX によるグラフ分析処理の実例と入門GraphX によるグラフ分析処理の実例と入門
GraphX によるグラフ分析処理の実例と入門鉄平 土佐
 
Introduction to Chainer (LL Ring Recursive)
Introduction to Chainer (LL Ring Recursive)Introduction to Chainer (LL Ring Recursive)
Introduction to Chainer (LL Ring Recursive)Kenta Oono
 
Ⅲ. 資料編 2017
Ⅲ. 資料編 2017Ⅲ. 資料編 2017
Ⅲ. 資料編 2017wada, kazumi
 
機械学習入門
機械学習入門機械学習入門
機械学習入門Fujio Kojima
 
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部Kiyoshi Ogawa
 
Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略Takayuki Shimizukawa
 
第2回メドレー読書会
第2回メドレー読書会第2回メドレー読書会
第2回メドレー読書会Shengbo Xu
 
200702material hirokawa
200702material hirokawa200702material hirokawa
200702material hirokawaRCCSRENKEI
 
PL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
PL/CUDA - Fusion of HPC Grade Power with In-Database AnalyticsPL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
PL/CUDA - Fusion of HPC Grade Power with In-Database AnalyticsKohei KaiGai
 
Arduinoでプログラミングに触れてみよう
Arduinoでプログラミングに触れてみようArduinoでプログラミングに触れてみよう
Arduinoでプログラミングに触れてみようHiromu Yakura
 

Similar a 2015年度先端GPGPUシミュレーション工学特論 第8回 偏微分方程式の差分計算 (拡散方程式) (20)

QGISプログラミング入門 FOSS4G 2013 Tokyo
QGISプログラミング入門 FOSS4G 2013 TokyoQGISプログラミング入門 FOSS4G 2013 Tokyo
QGISプログラミング入門 FOSS4G 2013 Tokyo
 
Kantocv 2-1-calibration publish
Kantocv 2-1-calibration publishKantocv 2-1-calibration publish
Kantocv 2-1-calibration publish
 
各言語の k-means 比較
各言語の k-means 比較各言語の k-means 比較
各言語の k-means 比較
 
DS Exercise Course 3
DS Exercise Course 3DS Exercise Course 3
DS Exercise Course 3
 
pg_hint_planを知る(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_hint_planを知る(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)pg_hint_planを知る(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_hint_planを知る(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
画像処理の高性能計算
画像処理の高性能計算画像処理の高性能計算
画像処理の高性能計算
 
2015年9月18日 (GTC Japan 2015) 深層学習フレームワークChainerの導入と化合物活性予測への応用
2015年9月18日 (GTC Japan 2015) 深層学習フレームワークChainerの導入と化合物活性予測への応用 2015年9月18日 (GTC Japan 2015) 深層学習フレームワークChainerの導入と化合物活性予測への応用
2015年9月18日 (GTC Japan 2015) 深層学習フレームワークChainerの導入と化合物活性予測への応用
 
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
 
準同型暗号の実装とMontgomery, Karatsuba, FFT の性能
準同型暗号の実装とMontgomery, Karatsuba, FFT の性能準同型暗号の実装とMontgomery, Karatsuba, FFT の性能
準同型暗号の実装とMontgomery, Karatsuba, FFT の性能
 
GraphX によるグラフ分析処理の実例と入門
GraphX によるグラフ分析処理の実例と入門GraphX によるグラフ分析処理の実例と入門
GraphX によるグラフ分析処理の実例と入門
 
Introduction to Chainer (LL Ring Recursive)
Introduction to Chainer (LL Ring Recursive)Introduction to Chainer (LL Ring Recursive)
Introduction to Chainer (LL Ring Recursive)
 
Ⅲ. 資料編 2017
Ⅲ. 資料編 2017Ⅲ. 資料編 2017
Ⅲ. 資料編 2017
 
機械学習入門
機械学習入門機械学習入門
機械学習入門
 
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部
 
2023_freshman
2023_freshman2023_freshman
2023_freshman
 
Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略
 
第2回メドレー読書会
第2回メドレー読書会第2回メドレー読書会
第2回メドレー読書会
 
200702material hirokawa
200702material hirokawa200702material hirokawa
200702material hirokawa
 
PL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
PL/CUDA - Fusion of HPC Grade Power with In-Database AnalyticsPL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
PL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
 
Arduinoでプログラミングに触れてみよう
Arduinoでプログラミングに触れてみようArduinoでプログラミングに触れてみよう
Arduinoでプログラミングに触れてみよう
 

Más de 智啓 出川

Fortranが拓く世界、VSCodeが架ける橋
Fortranが拓く世界、VSCodeが架ける橋Fortranが拓く世界、VSCodeが架ける橋
Fortranが拓く世界、VSCodeが架ける橋智啓 出川
 
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, 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) 智啓 出川
 
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智啓 出川
 
Cuda fortranの利便性を高めるfortran言語の機能
Cuda fortranの利便性を高めるfortran言語の機能Cuda fortranの利便性を高めるfortran言語の機能
Cuda fortranの利便性を高めるfortran言語の機能智啓 出川
 
PGI CUDA FortranとGPU最適化ライブラリの一連携法
PGI CUDA FortranとGPU最適化ライブラリの一連携法PGI CUDA FortranとGPU最適化ライブラリの一連携法
PGI CUDA FortranとGPU最適化ライブラリの一連携法智啓 出川
 
教育機関でのJetsonの活用の可能性
教育機関でのJetsonの活用の可能性教育機関でのJetsonの活用の可能性
教育機関でのJetsonの活用の可能性智啓 出川
 
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 (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)智啓 出川
 
2015年度先端GPGPUシミュレーション工学特論 第10回 Poisson方程式の求解 (線形連立一次方程式)
2015年度先端GPGPUシミュレーション工学特論 第10回 Poisson方程式の求解(線形連立一次方程式)2015年度先端GPGPUシミュレーション工学特論 第10回 Poisson方程式の求解(線形連立一次方程式)
2015年度先端GPGPUシミュレーション工学特論 第10回 Poisson方程式の求解 (線形連立一次方程式)智啓 出川
 

Más de 智啓 出川 (14)

Fortranが拓く世界、VSCodeが架ける橋
Fortranが拓く世界、VSCodeが架ける橋Fortranが拓く世界、VSCodeが架ける橋
Fortranが拓く世界、VSCodeが架ける橋
 
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, 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)
 
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
 
Cuda fortranの利便性を高めるfortran言語の機能
Cuda fortranの利便性を高めるfortran言語の機能Cuda fortranの利便性を高めるfortran言語の機能
Cuda fortranの利便性を高めるfortran言語の機能
 
PGI CUDA FortranとGPU最適化ライブラリの一連携法
PGI CUDA FortranとGPU最適化ライブラリの一連携法PGI CUDA FortranとGPU最適化ライブラリの一連携法
PGI CUDA FortranとGPU最適化ライブラリの一連携法
 
教育機関でのJetsonの活用の可能性
教育機関でのJetsonの活用の可能性教育機関でのJetsonの活用の可能性
教育機関でのJetsonの活用の可能性
 
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 (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)
 
2015年度先端GPGPUシミュレーション工学特論 第10回 Poisson方程式の求解 (線形連立一次方程式)
2015年度先端GPGPUシミュレーション工学特論 第10回 Poisson方程式の求解(線形連立一次方程式)2015年度先端GPGPUシミュレーション工学特論 第10回 Poisson方程式の求解(線形連立一次方程式)
2015年度先端GPGPUシミュレーション工学特論 第10回 Poisson方程式の求解 (線形連立一次方程式)
 

2015年度先端GPGPUシミュレーション工学特論 第8回 偏微分方程式の差分計算 (拡散方程式)