OpenACC

Size: px
Start display at page:

Download "OpenACC"

Transcription

1 109 OpenMP/OpenACC, cc.u-tokyo.ac.jp cc.u-tokyo.ac.jp 1

2 n Reedbush n $ ssh -Y reedbush.cc.u-tokyo.ac.jp l txxxxx n module n $ module load pgi/18.7 # n n $ cdw n OpenACC_samples n $ cp /lustre/gt00/share/openmp_openacc.tar.gz. n $ tar zxvf OpenMP_OpenACC.tar.gz u 自宅で学習したい人へ u PGI compiler の無償版をダウンロードしましょう -> PGI の代理店 (SofTek さん ) のページ u 本実習のプログラムは以下 -> 2

3 GPU 3

4 What s GPU? Graphics Processing Unit n もともと PC の3D描画専用の装置 n n パソコンの部品として量産されて る = 非常に安価 3D Game Computer Graphics GPU 4

5 GPUコンピューティング n n n n n GPUはグラフィックスやゲームの画像計算のために進化を続けてい る CPUがコア数が2-12個程度に対し GPUは1000以上のコアがある GPUを一般のアプリケーションの高速化に利用することを GPUコ ンピューティング GPGPU (General Purpose computation on GPU) などという 2007年にNVIDIA社のCUDA言語がリリースされて大きく発展 ここ数年 ディープラーニング 深層学習 機械学習 AI 人工 知能 などでも注目を浴びている 5

6 GPU n n n GPU ü ü NVIDIA P100 (Reedbush-H) 5,304 GFlops ü Intel Xeon Phi (Oakforest-PACS) 3,046.4 GFLops ü ü ü CPU ü CPU GPU 1000 ü CPU ü GPU CPU 6

7 NVIDIA Tesla P100 n 56 SMs, 3584 CUDA, 16 GByte Tesla P100 whitepaper 7

8 n T p T / p T p T/p n ü ü n ü 8

9 n n ü ü ü ü ü n 9

10 n ü n ü = = = = = = = = 4-6 = = = = = = = 3 11 = = = = = = = 1-10 = = 10

11 GPU 1. 必要なデータを送る ノードの外へ バス (PCIe など ) ~20GB/s CPU OS が動いている ~32GB/s GPU OS は存在しない 3. 計算結果を返す 2. 計算を行う ~200GB/s ~1,000GB/s メインメモリ デバイスメモリ n OS CPU n 11

12 GPU n CPU GPU ü CPU GPU CPU GPU ü OpenACC n >> P ü ü ü Intel CPU Hyperthread x 2 12

13 GPU n ü 32 Warp ü Warp ü branch divergence, divergent branch if ( 奇数番スレッド ) { 処理 A; else { 処理 B; 13

14 GPU n Warp ü coalesced access ü 128 Byte 128 Byte Byte 128 byte x 1 Address Thread 128 byte x Address Thread

15 OPENACC 15

16 GPU n CUFFT, CUBLAS ü GPU ü n OpenACC ü ü n CUDA OpenCL ü GPU ü GPGPU 16

17 OpenACC n OpenACC ü ü OpenMP ü C /C++, Fortran ü 2011 OpenACC ü PGI, Cray, GCC PGI ü WEB n ü ü ü CPU C 言語 #pragma acc directive-name [clause, ] { // C code Fortran!$acc directive-name [clause, ]! Fortran code!$acc end directive-name 17

18 OpenMP OpenACC 1 OpenMP OpenACC int main(){... #pragma acc... for (i=0; i<n; i++) { CPU CPU CPU GPU) 18

19 OpenACC C openacc_hello/01_hello_acc CPU GPU int main(){ const int n = 1000; float *a = malloc(n*sizeof(float)); float *b = malloc(n*sizeof(float)); float c = 2.0; for (int i=0; i<n; i++) { a[i] = 10.0; #pragma acc data copyin(a[0:n]), copyout(b[0:n]) #pragma acc kernels #pragma acc loop independent for (int i=0; i<n; i++) { b[i] = a[i] + c; double sum = 0; for (int i=0; i<n; i++) { sum += b[i]; fprintf(stdout, "%f n", sum/n); free(a); free(b); return 0; a b GPU へ copyin a b GPU から copyout 19

20 OpenACC C openacc_hello/01_hello_acc CPU GPU int main(){ const int n = 1000; float *a = malloc(n*sizeof(float)); float *b = malloc(n*sizeof(float)); float c = 2.0; for (int i=0; i<n; i++) { a[i] = 10.0; #pragma acc data copyin(a[0:n]), copyout(b[0:n]) #pragma acc kernels #pragma acc loop independent for (int i=0; i<n; i++) { b[i] = a[i] + c; double sum = 0; for (int i=0; i<n; i++) { sum += b[i]; fprintf(stdout, "%f n", sum/n); free(a); free(b); return 0; a b GPU へ copyin a b GPU から copyout 20

21 OpenACC F openacc_hello/01_hello_acc CPU GPU program main implicit none! 変数宣言 allocate(a(n),b(n)) c = 2.0 do i = 1, n a(i) = 10.0 end do!$acc data copyin(a) copyout(b)!$acc kernels!$acc loop independent do i = 1, n b(i) = a(i) + c end do!$acc end kernels!$acc end data sum = 0.d0 do i = 1, n sum = sum + b(i) end do print *, sum/n deallocate(a,b) end program main a b GPU へ copyin a b GPU から copyout 21

22 OpenACC n ü kernels, parallel n ü data, enter data, exit data, update n ü loop n ü host_data, atomic, routine, declare 22

23 OpenACC n kernels ü ü int main() { #pragma acc kernels { for (int i=0; i<n; i++) { A; 1 program main!$ acc kernels do i = 1, n A; end do for (int i=0; i<n; i++) { B; 2 do i = 1, n B; end do!$acc end kernels ü parallel 23

24 CPU OpenACC C openacc_hello/01_hello_acc int main(){ const int n = 1000; float *a = malloc(n*sizeof(float)); float *b = malloc(n*sizeof(float)); float c = 2.0; for (int i=0; i<n; i++) { a[i] = 10.0; n OpenACC ü kernels, loop for (int i=0; i<n; i++) { b[i] = a[i] + c; double sum = 0; for (int i=0; i<n; i++) { sum += b[i]; fprintf(stdout, "%f n", sum/n); free(a); free(b); return 0; 24

25 CPU OpenACC C openacc_hello/01_hello_acc int main(){ const int n = 1000; float *a = malloc(n*sizeof(float)); float *b = malloc(n*sizeof(float)); float c = 2.0; for (int i=0; i<n; i++) { a[i] = 10.0; n OpenACC ü kernels, loop #pragma acc kernels #pragma acc loop independent for (int i=0; i<n; i++) { b[i] = a[i] + c; double sum = 0; for (int i=0; i<n; i++) { sum += b[i]; fprintf(stdout, "%f n", sum/n); free(a); free(b); return 0; 25

26 CPU OpenACC C openacc_hello/01_hello_acc int main(){ const int n = 1000; float *a = malloc(n*sizeof(float)); float *b = malloc(n*sizeof(float)); float c = 2.0; for (int i=0; i<n; i++) { a[i] = 10.0; n OpenACC ü kernels, loop #pragma acc kernels #pragma acc loop independent for (int i=0; i<n; i++) { b[i] = a[i] + c; カーネルとしてコンパイルされ GPU 上で実行される配列の 1 要素が 1 スレッドで処理されるイメージ double sum = 0; for (int i=0; i<n; i++) { sum += b[i]; fprintf(stdout, "%f n", sum/n); free(a); free(b); return 0; 26

27 CPU OpenACC F openacc_hello/01_hello_acc program main implicit none! 変数宣言 allocate(a(n),b(n)) c = 2.0 n OpenACC ü kernels, loop do i = 1, n a(i) = 10.0 end do!$acc kernels!$acc loop independent do i = 1, n b(i) = a(i) + c end do!$acc end kernels Fortran も同じ sum = 0.d0 do i = 1, n sum = sum + b(i) end do print *, sum/n deallocate(a,b) end program main 27

28 OpenACC n ü firstprivate private ü OpenMP shared ü n ü shared ü ü n kernels ü OpenACC ü shared ü data 28

29 C n data ü (GPU) (CPU) (GPU) kernels data ü CUDA cudamalloc, cudamemcpy int main(){ const int n = 1000; float *a = malloc(n*sizeof(float)); float *b = malloc(n*sizeof(float)); float c = 2.0; for (int i=0; i<n; i++) { a[i] = 10.0; #pragma acc data copyin(a[0:n]), copyout(b[0:n]) #pragma acc kernels #pragma acc loop independent for (int i=0; i<n; i++) { b[i] = a[i] + c; openacc_hello/01_hello_acc 変数 c はスカラ変数のため 自動的にデバイスへコピーされ プライベート変数となる 29

30 F n data ü (GPU) (CPU) (GPU) kernels data ü CUDA cudamalloc, cudamemcpy program main implicit none integer,parameter :: n = 1000 real(kind=4),allocatable,dimension(:) :: a,b real(kind=4) :: c integer :: i real(kind=8) :: sum allocate(a(n),b(n)) c = 2.0 do i = 1, n a(i) = 10.0 end do!$acc data copyin(a) copyout(b)!$acc kernels!$acc loop independent do i = 1, n b(i) = a(i) + c end do!$acc end kernels!$acc end data openacc_hello/01_hello_acc Fortran では配列サイズ情報が変数に付随するため (lbound,ubound,size などの組み込み関数をサポートしている ) 基本的にサイズを書く必要がない 30

31 data n n n n n copy ü allocate, memcpy(h->d), memcpy(d->h), deallocate copyin ü allocate, memcpy(h->d), deallocate ü copyout ü allocate, memcpy(d->h), deallocate ü create ü allocate, deallocate ü present ü n copy/copyin/copyout/create present OpenACC2.5 31

32 enter data, exit data n data #pragma acc data copyin(a[0:n]) copyout(b[0:n]) { goto hoge; hoge: NG!$acc data copyin(a), copyout(b) goto 1000!$acc end data 1000 NG ü goto n enter data exit data data #pragma acc enter data copyin(a[0:n]) create(b[0:n]) { goto hoge: hoge: #pragma acc exit data delete(a[0:n]) copyout(b[0:n]) OK!$acc enter data!$acc& copyin(a) create(b) goto !$acc exit data!$acc& delete(a) copyout(b) NG ü enter data copyout create, exit data copyin delete 32

33 n n n Fortran C n A n Fortran:!$acc data copy(a(lower1:upper1, lower2:upper2) )...!$acc end data n C : #pragma acc data copy(a[begin1:length1][begin2:length2])... 33

34 C openacc_hello/01_hello_acc CPU GPU int main(){ const int n = 1000; float *a = malloc(n*sizeof(float)); float *b = malloc(n*sizeof(float)); float c = 2.0; for (int i=0; i<n; i++) { a[i] = 10.0; #pragma acc data copyin(a[0:n]), copyout(b[0:n]) #pragma acc kernels #pragma acc loop independent for (int i=0; i<n; i++) { b[i] = a[i] + c; double sum = 0; for (int i=0; i<n; i++) { sum += b[i]; fprintf(stdout, "%f n", sum/n); free(a); free(b); return 0; loop a b GPU へ copyin a b GPU から copyout 34

35 F openacc_hello/01_hello_acc CPU GPU program main implicit none! 変数宣言 allocate(a(n),b(n)) c = 2.0 a b do i = 1, n a(i) = 10.0 end do!$acc data copyin(a) copyout(b)!$acc kernels!$acc loop independent do i = 1, n b(i) = a(i) + c end do!$acc end kernels!$acc end data sum = 0.d0 do i = 1, n sum = sum + b(i) end do print *, sum/n deallocate(a,b) end program main loop GPU へ copyin a b GPU から copyout 35

36 loop n loop ü CUDA gang, worker, vector gang: CUDA thread block vector: CUDA block threads ü (independent clause) C ü (reduction clause) ü (seq clause) 36

37 n independent ü ü #pragma acc kernels #pragma acc loop independent for (int i=0; i<n; i++) { b[i] = a[i] + c; independent n // これは正しくない #pragma acc kernels #pragma acc loop independent for (int i=1; i<n; i++) { d[i] = d[i-1]; 37

38 OpenACC CUDA // OpenACC void calc(int n, const float *a, const float *b, float c, float *d) { #pragma acc kernels present(a, b, d) #pragma acc loop independent for (int i=0; i<n; i++) { d[i] = a[i] + c*b[i]; kernel // CUDA global void calc_kernel(int n, const float *a, const float *b, float c, float *d) { const int i = blockidx.x * blockdim.x + threadidx.x; if (i < n) { d[i] = a[i] + c*b[i]; int main() {... #pragma acc data copyin(a[0:n], b[0:n]) copyout(d[0:n]) { calc(n, a, b, c, d);... ü ü ü kernels GPU loop data kernels void calc(int n, const float *a, const float *b, float c, float *d) { dim3 threads(128); dim3 blocks((n + threads.x - 1) / threads.x); calc_kernel<<<blocks, threads>>>(n, a, b, c, d); cudathreadsynchronize(); int main() {... float *a_d, *b_d, *d_d; cudamalloc(&a_d, n*sizeof(float)); cudamalloc(&b_d, n*sizeof(float)); cudamalloc(&d_d, n*sizeof(float)); cudamemcpy(a_d, a, n*sizeof(float), cudamemcpydefault); cudamemcpy(b_d, b, n*sizeof(float), cudamemcpydefault); cudamemcpy(d_d, d, n*sizeof(float), cudamemcpydefault); calc(n, a_d, b_d, c, d_d); cudamemcpy(d, d_d, n*sizeof(float), cudamemcpydefault);... 38

39 OpenACC n PGI ü Reedbush OpenACC PGI $ module load pgi/18.7 $ pgcc -O3 -acc -Minfo=accel -ta=tesla,cc60 -c main.c -acc: OpenACC -Minfo=accel: OpenACC GPU OpenACC -ta=tesla,cc60: NVIDIA GPU Tesla compute capability 6.0 (cc60) n Makefile Makefile $ module load pgi/18.7 $ make 39

40 OpenACC n : openacc_basic/ C ü OpenACC kernels, data, loop ü F for (unsigned int j=0; j<ny; j++) { for (unsigned int i=0; i<nx; i++) { const int ix = i + j*nx; c[ix] += a[ix] + b[ix]; do j = 1,ny do i = 1,nx c(i,j) = a(i,j) + b(i,j) end do end do ü openacc_basic/01_original openacc_basic/02_kernels openacc_basic/03_kernels_copy openacc_basic/04_loop openacc_basic/05_data openacc_basic/06_present openacc_basic/07_reduction CPUコード OpenACCコード 上にkernels 指示文のみ追加 OpenACCコード 上にcopy 指示節追加 OpenACCコード 上にloop 指示文を追加 OpenACCコード 上にdata 指示文を明示的に追加 OpenACCコード 上でpresent 指示節を使用 OpenACC コード 上に reduction 指示節を使用 40

41 C n : openacc_basic/ ü OpenACC kernels, data, loop ü void calc(unsigned int nx, unsigned int ny, const float *a, const float *b, float *c){ for (unsigned int j=0; j<ny; j++) { for (unsigned int i=0; i<nx; i++) { const int ix = i + j*nx; c[ix] += a[ix] + b[ix]; ix = j*nx + i ny j i nx 41

42 F n : openacc_basic/ ü OpenACC kernels, data, loop ü subroutine calc(nx, ny, a, b, c) implicit none integer,intent(in) :: nx,ny real(kind=4),dimension(:,:),intent(in) :: a,b real(kind=4),dimension(:,:),intent(out) :: c integer :: i,j do j = 1,ny do i = 1,nx c(i,j) = a(i,j) + b(i,j) end do end do end subroutine calc Fortran 版では多次元配列を利用 42

43 OpenACC: CPU n CPU ü $ cd openacc_basic/01_original $ make $ qsub./run.sh $ cat run.sh.o?????? mean = Time = [sec] n ü a b c 1.0, 2.0, 0.0 ü calc c += a *b nt(=1000) ü openacc_basic/01_original 43

44 C F OpenACC: kernels n 02_kernels : calc ü CPU kernels openacc_basic/02_kernels void calc(unsigned int nx, unsigned int ny, const float *a, const float *b, float *c){ const unsigned int n = nx * ny; #pragma acc kernels for (unsigned int j=0; j<ny; j++) { for (unsigned int i=0; i<nx; i++) { const int ix = i + j*nx; c[ix] += a[ix] + b[ix]; subroutine calc(nx, ny, a, b, c) implicit none integer,intent(in) :: nx,ny real(kind=4),dimension(:,:),intent(in) :: a,b real(kind=4),dimension(:,:),intent(out) :: c integer :: i,j!$acc kernels do j = 1,ny do i = 1,nx c(i,j) = a(i,j) + b(i,j) end do end do!$acc end kernels end subroutine calc OpenACC コンパイラは配列 (a, b, c) を shared 変数として自動で転送してくれるはずだが 44 C F

45 C F OpenACC: kernels n データサイズがわからずコンパイルエラー C 言語では配列サイズの指定がほぼ必須! $ make pgcc -O3 -acc -Minfo=accel -ta=tesla,cc60 -c main.c PGC-S-0155-Compiler failed to translate accelerator region (see -Minfo messages): Could not find allocated-variable index for symbol (main.c: 13) calc: 14, Complex loop carried dependence of a->,c->,b-> prevents parallelization Accelerator serial kernel generated Accelerator kernel generated Generating Tesla code 14, #pragma acc loop seq 15, #pragma acc loop seq 15, Accelerator restriction: size of the GPU copy of c,b,a is unknown Complex loop carried dependence of a->,c->,b-> prevents parallelization PGC-F-0704-Compilation aborted due to previous errors. (main.c) PGC/x86-64 Linux : compilation aborted make: *** [main.o] Error 2 $ make pgfortran -O3 -mp -acc -ta=tesla,cc60 -Minfo=accel -c main.f90 calc: 13, Generating implicit copyin(b(:nx,:ny)) Generating implicit copyout(c(:nx,:ny)) Generating implicit copyin(a(:nx,:ny)) 14, Loop is parallelizable 15, Loop is parallelizable Accelerator kernel generated Generating Tesla code 14,!$acc loop gang, vector(4)! blockidx%y threadidx%y 15,!$acc loop gang, vector(32)! blockidx%x threadidx%x 45 C F データサイズを検知して自動転送 Fotran ではサイズ情報が配列に付随するため

46 OpenACC: kernels C n 03_kernels_copy : calc ü void calc(unsigned int nx, unsigned int ny, const float *a, const float *b, float *c){ const unsigned int n = nx * ny; #pragma acc kernels copy(a[0:n], b[0:n], c[0:n]) for (unsigned int j=0; j<ny; j++) { allocate, H -> D for (unsigned int i=0; i<nx; i++) { const int ix = i + j*nx; c[ix] += a[ix] + b[ix]; D->H, deallocate ü kernels data ü copy openacc_basic/03_kernels_copy ü GPU CPU 46

47 OpenACC: kernels n 03_kernels_copy : ü CPU kernels openacc_basic/03_kernels_copy C F C int main(int argc, char *argv[]) {... #pragma acc kernels copyout(b[0:n], c[0:n]) { for (unsigned int i=0; i<n; i++) { b[i] = b0; for (unsigned int i=0; i<n; i++) { c[i] = 0.0;... F program main...!$acc kernels copyout(b,c) do j = 1,ny do i = 1,nx b(i,j) = b0 end do end do c(:,:) = 0.0!$acc end kernels... end program 47

48 OpenACC: kernels C n ü $ make pgcc -O3 -acc -Minfo=accel -ta=tesla,cc60 -c main.c calc: 13, Generating copy(a[:n],c[:n],b[:n]) 14, Complex loop carried dependence of a-> prevents parallelization Loop carried dependence due to exposed use of c[:n] prevents parallelization Complex loop carried dependence of c->,b-> prevents parallelization Accelerator scalar kernel generated Accelerator kernel generated Generating Tesla code 14, #pragma acc loop seq 15, #pragma acc loop seq 15, Complex loop carried dependence of a->,c->,b-> prevents parallelization Loop carried dependence due to exposed use of c[:i1+n] prevents parallelization main: 43, Generating copyout(c[:n],b[:n]) 45, Loop is parallelizable Accelerator kernel generated Generating Tesla code 45, #pragma acc loop gang, vector(128) /* blockidx.x threadidx.x */ 48, Loop is parallelizable Accelerator kernel generated Generating Tesla code 48, #pragma acc loop gang, vector(128) /* blockidx.x threadidx.x */ pgcc -O3 -acc -Minfo=accel -ta=tesla,cc60 main.o -o run 48

49 OpenACC: kernels n ü pgfortran -O3 -mp -acc -ta=tesla,cc60 -Minfo=accel -c main.f90 calc: 13, Generating copyin(a(:,:)) Generating copyout(c(:,:)) Generating copyin(b(:,:)) 14, Loop is parallelizable 15, Loop is parallelizable Accelerator kernel generated Generating Tesla code 14,!$acc loop gang, vector(4)! blockidx%y threadidx%y 15,!$acc loop gang, vector(32)! blockidx%x threadidx%x main: 61, Generating copyout(c(:,:),b(:,:)) 62, Loop is parallelizable 63, Loop is parallelizable Accelerator kernel generated Generating Tesla code 62,!$acc loop gang, vector(4)! blockidx%y threadidx%y 63,!$acc loop gang, vector(32)! blockidx%x threadidx%x 68, Loop is parallelizable Accelerator kernel generated Generating Tesla code 68,!$acc loop gang, vector(4)! blockidx%y threadidx%y!$acc loop gang, vector(32)! blockidx%x threadidx%x pgfortran -O3 -mp -acc -ta=tesla,cc60 -Minfo=accel main.o -o run 49 F

50 Tips: n n n n foo(&a[0],&a[1]) n n n n Fortran n C n これってデータ独立? void foo(float *a, float *b){ for (int i=0; i<n; i++) b[i] = a[i]; インデックス計算 for (int i=0; i<n; i++){ j = i % 10; b[j] = a[i]; 間接参照 for (int i=0; i<n; i++){ b[idx[i]] = a[i]; 50

51 OpenACC: loop C n 04_loop ü 03_kernels loop independent openacc_basic/04_loop void calc(unsigned int nx, unsigned int ny, const float *a, const float *b, float *c){ const unsigned int n = nx * ny; #pragma acc kernels copy(a[0:n], b[0:n], c[0:n]) #pragma acc loop independent for (unsigned int j=0; j<ny; j++) { #pragma acc loop independent for (unsigned int i=0; i<nx; i++) { const int ix = i + j*nx; c[ix] += a[ix] + b[ix]; // main 関数内 #pragma acc kernels copyout(b[0:n], c[0:n]) { #pragma acc loop independent for (unsigned int i=0; i<n; i++) { b[i] = b0; #pragma acc loop independent for (unsigned int i=0; i<n; i++) { c[i] = 0.0; 51

52 OpenACC: loop F n 04_loop ü 03_kernels loop independent subroutine calc(nx, ny, a, b, c)...!$acc kernels copyin(a,b) copyout(c)!$acc loop independent do j = 1,ny!$acc loop independent do i = 1,nx c(i,j) = a(i,j) + b(i,j) end do end do!$acc end kernels end subroutine openacc_basic/04_loop! main 関数内!$acc kernels copyout(b,c)!$acc loop independent do j = 1,ny!$acc loop independent do i = 1,nx b(i,j) = b0 end do end do c(:,:) = 0.0!$acc end kernels 各次元について loop 指示文を指定する ( 並列サイズなどを指定したいなど ) 場合 do 文で書き下す必要がある 52

53 OpenACC: loop C n ü openacc_basic/04_loop $ make pgcc -O3 -acc -Minfo=accel -ta=tesla,cc60 -c main.c calc: 13, Generating copy(a[:n],c[:n],b[:n]) 15, Loop is parallelizable 17, Loop is parallelizable Accelerator kernel generated Generating Tesla code 15, #pragma acc loop gang, vector(4) /* blockidx.y threadidx.y */ 17, #pragma acc loop gang, vector(32) /* blockidx.x threadidx.x */ main: 45, Generating copyout(c[:n],b[:n]) 48, Loop is parallelizable Accelerator kernel generated Generating Tesla code 48, #pragma acc loop gang, vector(128) /* blockidx.x threadidx.x */ 52, Loop is parallelizable Accelerator kernel generated Generating Tesla code 52, #pragma acc loop gang, vector(128) /* blockidx.x threadidx.x */ Fortran 版は既に並列化されていたため省略 loop independent をつける事による挙動の変化はない ( 少なくとも PGI compiler ver では ) 53

54 OpenACC: loop n 04_loop ü $ qsub./run.sh $ cat run.sh.o?????? mean = Time = [sec] openacc_basic/04_loop ü calc GPU CPU void calc(unsigned int nx, unsigned int ny, const float *a, const float *b, float *c){ const unsigned int n = nx * ny; #pragma acc kernels copy(a[0:n], b[0:n], c[0:n]) #pragma acc loop independent allocate, H -> D for (unsigned int j=0; j<ny; j++) { #pragma acc loop independent for (unsigned int i=0; i<nx; i++) { const int ix = i + j*nx; c[ix] += a[ix] + b[ix]; D->H, deallocate 54

55 OpenACC: data C n 05_data ü 04_loop data // main 関数内 #pragma acc data copyin(a[0:n]) create(b[0:n]) copyout(c[0:n]) { #pragma acc kernels copyout(b[0:n], c[0:n]) { #pragma acc loop independent for (unsigned int i=0; i<n; i++) { b[i] = b0; #pragma acc loop independent for (unsigned int i=0; i<n; i++) { c[i] = 0.0; for (unsigned int icnt=0; icnt<nt; icnt++) { calc(nx, ny, a, b, c); openacc_basic/05_data a: allocate, H -> D b: allocate c: allocate present a: deallocate b: deallocate c: D->H, deallocate ü copy/copyin/copyout/create present OpenACC2.5 ü a, b, c 55

56 OpenACC: data F n 05_data ü 04_loop data! main 関数内!$acc data copyin(a) create(b) copyout(c)!$acc kernels copyout(b,c)!$acc loop independent do j = 1,ny!$acc loop independent do i = 1,nx b(i,j) = b0 end do end do openacc_basic/05_data a: allocate, H -> D b: allocate c: allocate present c(:,:) = 0.0!$acc end kernels do icnt = 1,nt call calc(nx, ny, a, b, c) end do!$acc end data a: deallocate b: deallocate c: D->H, deallocate ü copy/copyin/copyout/create present OpenACC2.5 ü a, b, c 56

57 OpenACC: data n 05_data ü $ qsub./run.sh $ cat run.sh.o?????? mean = Time = [sec] openacc_basic/05_data 57

58 OpenACC: present C n 06_present ü 05_data present openacc_basic/06_present void calc(unsigned int nx, unsigned int ny, const float *a, const float *b, float *c){ const unsigned int n = nx * ny; #pragma acc kernels present(a, b, c) #pragma acc loop independent present for (unsigned int j=0; j<ny; j++) { #pragma acc loop independent for (unsigned int i=0; i<nx; i++) { const int ix = i + j*nx; c[ix] += a[ix] + b[ix]; F subroutine calc(nx, ny, a, b, c)...!$acc kernels present(a, b, c)!$acc loop independent do j = 1,ny!$acc loop independent do i = 1,nx c(i,j) = a(i,j) + b(i,j) end do end do!$acc end kernels end subroutine u データ転送の振る舞いは変化しないため 性能変化はなし u present ではメモリ確保 データ転送をしないため 配列サイズの指定は不要 u コードとしては見通しがよい 58

59 n ü ü ü CUDA 1 double sum = 0.0; for (unsigned int i=0; i<n; i++) { sum += array[i];

60 ( n loop reduction ü reduction double sum = 0.0; #pragma acc kernels #pragma acc loop reduction(+:sum) for (unsigned int i=0; i<n; i++) { sum += array[i]; n Reduction ü acc loop reduction(+:sum) ü n ü : +, : 0 ü : *, : 1 ü : max, : least ü : min, : largest 60

61 OpenACC: reduction C n 07_reduction ü 06_present reduction // main 関数内 for (unsigned int icnt=0; icnt<nt; icnt++) { calc(nx, ny, a, b, c); openacc_basic/07_reduction #pragma acc kernels #pragma acc loop reduction(+:sum) for (unsigned int i=0; i<n; i++) { sum += c[i]; ü data c create n 07_reduction ü $ make pgcc -O3 -acc -Minfo=accel -ta=tesla,cc60 -c main.c ( 省略 ) main: ( 省略 ) 67, Loop is parallelizable Accelerator kernel generated Generating Tesla code 67, #pragma acc loop gang, vector(128) /* blockidx.x threadidx.x */ Generating reduction(+:sum) 61

62 OpenACC: reduction n 07_reduction ü 06_present reduction sum = 0!$acc kernels present(c)!$acc loop reduction(+:sum) do j = 1,ny!$acc loop reduction(+:sum) do i = 1,nx sum = sum + c(i,j) end do end do!$acc end kernels ü data c create n 07_reduction ü $ make pgfortran -O3 -mp -acc -ta=tesla,cc60 -Minfo=accel -c main.f90 ( 省略 ) main: ( 省略 ) 86, Loop is parallelizable Accelerator kernel generated Generating Tesla code 84,!$acc loop gang, vector(4)! blockidx%y threadidx%y 86,!$acc loop gang, vector(32)! blockidx%x threadidx%x Generating reduction(+:sum) openacc_basic/07_reduction reduction 62 F

63 OpenACC: reduction n 07_reduction ü ü c GPU $ qsub./run.sh $ cat run.sh.o?????? mean = Time = [sec] openacc_basic/07_reduction 63

64 OpenACC C n OpenACC 3 ü kernels GPU ü data - ü loop #pragma acc data copyin(a[0:n]) create(b[0:n], c[0:n]) { #pragma acc kernels { #pragma acc loop independent for (unsigned int i=0; i<n; i++) { b[i] = b0; #pragma acc loop independent for (unsigned int i=0; i<n; i++) { c[i] = 0.0; for (unsigned int icnt=0; icnt<nt; icnt++) { calc(nx, ny, a, b, c); #pragma acc kernels #pragma acc loop reduction(+:sum) for (unsigned int i=0; i<n; i++) { sum += c[i]; openacc_basic/07_reduction 64

65 OpenACC F n OpenACC 3 ü kernels GPU ü data - ü loop!$acc data copyin(a) create(b,c)!$acc kernels present(b,c)!$acc loop independent do j = 1,ny!$acc loop independent do i = 1,nx b(i,j) = b0 end do end do c(:,:) = 0.0!$acc end kernels do icnt = 1,nt call calc(nx, ny, a, b, c) end do! 続く! 続き sum = 0!$acc kernels present(c)!$acc loop reduction(+:sum) do j = 1,ny!$acc loop reduction(+:sum) do i = 1,nx sum = sum + c(i,j) end do end do!$acc end kernels!$acc end data openacc_basic/07_reduction 65

66 OPENACC 66

67 C n 3 OpenACC ü openacc_diffusion/01_original n 3 CPU OpenACC kernels, data, loop GPU for(int k = 0; k < nz; k++) { for (int j = 0; j < ny; j++) { for (int i = 0; i < nx; i++) { const int ix = nx*ny*k + nx*j + i; const int ip = i == nx - 1? ix : ix + 1; const int im = i == 0? ix : ix - 1; const int jp = j == ny - 1? ix : ix + nx; const int jm = j == 0? ix : ix - nx; const int kp = k == nz - 1? ix : ix + nx*ny; const int km = k == 0? ix : ix - nx*ny; diffusion.c, diffusion3d fn[ix] = cc*f[ix] + ce*f[ip] + cw*f[im] + cn*f[jp] + cs*f[jm] + ct*f[kp] + cb*f[km]; openacc_diffusion/01_original 67

68 F n 3 OpenACC ü openacc_diffusion/01_original n 3 CPU OpenACC kernels, data, loop GPU do k = 1, nz do j = 1, ny do i = 1, nx diffusion.f90, diffusion3d w = -1; e = 1; n = -1; s = 1; b = -1; t = 1; if(i == 1) w = 0 if(i == nx) e = 0 if(j == 1) n = 0 if(j == ny) s = 0 if(k == 1) b = 0 if(k == nz) t = 0 fn(i,j,k) = cc * f(i,j,k) + cw * f(i+w,j,k) & + ce * f(i+e,j,k) + cs * f(i,j+s,k) + cn * f(i,j+n,k) & + cb * f(i,j,k+b) + ct * f(i,j,k+t) end do end do end do openacc_diffusion/01_original 68

69 n ü ü n ü 69

70 n ü ü 3 C 1 ü 2 n ü : nx * ny * nz 3 ü : nt 70

71 n 2 平均後の自分自身の値 上下左右の値 自分自身の値の 4 倍 j 最初の状態 12 回目の平均後 i 繰り返し平均化を行うと インクが拡散します 71

72 n 2 72

73 CPU n CPU $ cd openacc_diffusion/01_original $ make $ qsub./run.sh # cat run.sh.o?????? time( 0) = time( 100) = time( 200) = time(1000) = time(1100) = time(1200) = time(1300) = time(1400) = time(1500) = time(1600) = Time = [sec] Performance= 2.17 [GFlops] Error[128][128][128] = e-06 n OpenACC 73

74 OpenACC (0): Makefile n Makefile OpenACC acc C CC = pgcc CXX = pgc++ GCC = gcc RM = rm -f MAKEDEPEND = makedepend CFLAGS = -O3 -acc -Minfo=accel -ta=tesla,cc60 GFLAGS = -Wall -O3 -std=c99 CXXFLAGS = $(CFLAGS) LDFLAGS =... F F90 = pgfortran RM = rm -f FFLAGS... = -O3 -mp -acc -ta=tesla,cc60 -Minfo=accel 74

75 OpenACC (1): kernels C n diffusion3d kernels #pragma acc kernels copyin(f[0:nx*ny*nz]) copyout(fn[0:nx*ny*nz]) for(int k = 0; k < nz; k++) { for (int j = 0; j < ny; j++) { for (int i = 0; i < nx; i++) { const int ix = nx*ny*k + nx*j + i; const int ip = i == nx - 1? ix : ix + 1; const int im = i == 0? ix : ix - 1; const int jp = j == ny - 1? ix : ix + nx; const int jm = j == 0? ix : ix - nx; const int kp = k == nz - 1? ix : ix + nx*ny; const int km = k == 0? ix : ix - nx*ny; fn[ix] = cc*f[ix] + ce*f[ip] + cw*f[im] + cn*f[jp] + cs*f[jm] + ct*f[kp] + cb*f[km]; return (double)(nx*ny*nz)*13.0; diffusion.c, diffusion3d make 75

76 OpenACC (1): kernels F n diffusion3d kernels!$acc kernels copyin(f) copyout(fn) do k = 1, nz do j = 1, ny do i = 1, nx w = -1; e = 1; n = -1; s = 1; b = -1; t = 1; if(i == 1) w = 0 if(i == nx) e = 0 if(j == 1) n = 0 if(j == ny) s = 0 if(k == 1) b = 0 if(k == nz) t = 0 fn(i,j,k) = cc * f(i,j,k) + cw * f(i+w,j,k) & + ce * f(i+e,j,k) + cs * f(i,j+s,k) + cn * f(i,j+n,k) & + cb * f(i,j,k+b) + ct * f(i,j,k+t) end do end do end do!$acc end kernels diffusion.f90, diffusion3d make 76

77 OpenACC (2): loop C n diffusion3d loop #pragma acc kernels copyin(f[0:nx*ny*nz]) copyout(fn[0:nx*ny*nz]) #pragma acc loop independent for(int k = 0; k < nz; k++) { #pragma acc loop independent for (int j = 0; j < ny; j++) { #pragma acc loop independent for (int i = 0; i < nx; i++) { const int ix = nx*ny*k + nx*j + i; const int ip = i == nx - 1? ix : ix + 1; const int im = i == 0? ix : ix - 1; const int jp = j == ny - 1? ix : ix + nx; const int jm = j == 0? ix : ix - nx; const int kp = k == nz - 1? ix : ix + nx*ny; const int km = k == 0? ix : ix - nx*ny; fn[ix] = cc*f[ix] + ce*f[ip] + cw*f[im] + cn*f[jp] + cs*f[jm] + ct*f[kp] + cb*f[km]; return (double)(nx*ny*nz)*13.0; diffusion.c, diffusion3d make qsub./run.sh 77

78 OpenACC (2): loop F n diffusion3d loop!$acc kernels copyin(f) copyout(fn)!$acc loop independent do k = 1, nz!$acc loop independent do j = 1, ny!$acc loop independent do i = 1, nx w = -1; e = 1; n = -1; s = 1; b = -1; t = 1; if(i == 1) w = 0 if(i == nx) e = 0 if(j == 1) n = 0 if(j == ny) s = 0 if(k == 1) b = 0 if(k == nz) t = 0 fn(i,j,k) = cc * f(i,j,k) + cw * f(i+w,j,k) & + ce * f(i+e,j,k) + cs * f(i,j+s,k) + cn * f(i,j+n,k) & + cb * f(i,j,k+b) + ct * f(i,j,k+t) end do end do end do!$acc end kernels diffusion.f90, diffusion3d make qsub./run.sh 78

79 OpenACC (3): (1) C n diffusion3d present main data #pragma acc kernels present(f, fn) #pragma acc loop independent for(int k = 0; k < nz; k++) { #pragma acc loop independent for (int j = 0; j < ny; j++) { #pragma acc loop independent for (int i = 0; i < nx; i++) { const int ix = nx*ny*k + nx*j + i; const int ip = i == nx - 1? ix : ix + 1; const int im = i == 0? ix : ix - 1; const int jp = j == ny - 1? ix : ix + nx; const int jm = j == 0? ix : ix - nx; const int kp = k == nz - 1? ix : ix + nx*ny; const int km = k == 0? ix : ix - nx*ny; diffusion.c, diffusion3d fn[ix] = cc*f[ix] + ce*f[ip] + cw*f[im] + cn*f[jp] + cs*f[jm] + ct*f[kp] + cb*f[km]; return (double)(nx*ny*nz)*13.0; present 79

80 OpenACC (3): (1) F n diffusion3d present main data!$acc kernels copyin(f) copyout(fn)!$acc loop independent do k = 1, nz!$acc loop independent do j = 1, ny!$acc loop independent do i = 1, nx diffusion.f90, diffusion3d end do end do end do!$acc end kernels w = -1; e = 1; n = -1; s = 1; b = -1; t = 1; if(i == 1) w = 0 if(i == nx) e = 0 if(j == 1) n = 0 if(j == ny) s = 0 if(k == 1) b = 0 if(k == nz) t = 0 fn(i,j,k) = cc * f(i,j,k) + cw * f(i+w,j,k) & + ce * f(i+e,j,k) + cs * f(i,j+s,k) + cn * f(i,j+n,k) & + cb * f(i,j,k+b) + ct * f(i,j,k+t) present 80

81 OpenACC (4): (2) C n diffusion3d present main data #pragma acc data copy(f[0:n]) create(fn[0:n]) { start_timer(); main.c, main for (; icnt<nt && time + 0.5*dt < 0.1; icnt++) { if (icnt % 100 == 0) fprintf(stdout, "time(%4d) = %7.5f n", icnt, time); flop += diffusion3d(nx, ny, nz, dx, dy, dz, dt, kappa, f, fn); swap(&f, &fn); time += dt; elapsed_time = get_elapsed_time(); copy/create make OpenACC openacc_diffusion/02_openacc 81

82 OpenACC (4): (2) F n diffusion3d present main data!$acc data copy(f) create(fn) call start_timer() main.f90, main do icnt = 0, nt-1 if(mod(icnt,100) == 0) write (*,"(A5,I4,A4,F7.5)"), "time(",icnt,") = ",time flop = flop + diffusion3d(nx, ny, nz, dx, dy, dz, dt, kappa, f, fn) call swap(f, fn) time = time + dt if(time + 0.5*dt >= 0.1) exit end do elapsed_time = get_elapsed_time()!$acc end data copy/create make OpenACC openacc_diffusion/02_openacc 82

83 PGI_ACC_TIME OpenACC n n n PGI OpenACC PGI_ACC_TIME Linux PGI_ACC_TIME 1 $ export PGI_ACC_TIME=1 $./run Reedbush PGI_ACC_TIME $ cat run.sh.... /etc/profile.d/modules.sh module load pgi/18.7 export PGI_ACC_TIME=1./run openacc_diffusion/03_openacc _pgi_acc_time 83

84 PGI_ACC_TIME OpenACC n $ cat run.sh.e?????? Accelerator Kernel Timing data /lustre/pz0115/z30115/lecture/lecture_samples/openacc_diffusion/03_open acc_pgi_acc_time/main.c main NVIDIA devicenum=0 time(us): 6,359 38: data region reached 2 times 38: data copyin transfers: 1 device time(us): total=3,327 max=3,327 min=3,327 avg=3,327 55: data copyout transfers: 1 device time(us): total=3,032 max=3,032 min=3,032 avg=3,032 /lustre/pz0115/z30115/lecture/lecture_samples/openacc_diffusion/03_open acc_pgi_acc_time/diffusion.c diffusion3d NVIDIA devicenum=0 time(us): 101,731 19: compute region reached 1638 times 25: kernel launched 1638 times grid: [4x128x32] block: [32x4] device time(us): total=101,731 max=64 min=62 avg=62 elapsed time(us): total=136,255 max=540 min=81 avg=83 19: data region reached 3276 times 84

85 OpenACC ICCG 85

86 ICCG OpenACC n : openacc_iccg/ ü ü ü ü openacc_iccg/01_original openacc_iccg/02_setup OpenMP コード これを改変します OpenACC 化を行うための準備をした OpenMP コード openacc_iccg/03_unified Unified memory 機能を用いた OpenACC コード ( 後述 ) openacc_iccg/04_data_present openacc_iccg/05_exclude_data cpy_time Unified memory 機能を用いない OpenACC コード CPU-GPU 間のデータ転送時間を時間計測から除いた OpenACC コード openacc_iccg/06_optimized 上を OpenACC で出来る範囲内で最適化 OpenACC コード 86

87 CPU n $ cat./run.sh #! /bin/sh #PBS -q h-lecture #PBS -l select=1:mpiprocs=1:ompthreads=18 #PBS -W group_list=gt00 #PBS -l walltime=00:05:00 openacc_iccg/01_original cd $PBS_O_WORKDIR. /etc/profile.d/modules.sh module load pgi/18.7 numactl./run -n 128 -c -20 -nt 18 n ü INPUT.DAT -nx 128 NX = 128 -n 128 NX = NY = NZ = 128 -c -20 NCOLORtot = -20 -e 1.0e-8 EPSICCG = 1.0e 08 -nt 18 PEsmpTOT = 18 87

88 CPU n $ qsub./run.sh $ cat./run.sh.o????? ### THREAD number= 18 You have elements. How many colors do you need? #COLOR must be more than 2 and #COLOR must not be more than CM if #COLOR.eq. 0 RCM if #COLOR.eq.-1 CMRCM if #COLOR.le.-2 => color number: 20 openacc_iccg/01_original C run.sh.e???? ### CM-RCM ### FINAL COLOR NUMBER E-01 sec. (assemble) E E E E E-09 N= E+01 sec. (solver) OpenACC 88

89 OpenACC Makefile n C CC = pgcc OPTFLAGS= -O3 -mp TARGET = run F F90 = pgfortran F90OPTFLAGS= -O3 mp TARGET = run openacc_iccg/02_setup CC = pgcc OPTFLAGS= -O3 -acc -Minfo=accel - ta=tesla:cc60 TARGET = run F90 = pgfortran F90OPTFLAGS= -O3 -acc -Minfo=accel -ta=tesla:cc60 TARGET = run 89

90 OpenACC n #! /bin/sh #PBS -q u-lecture #PBS -l select=1:mpiprocs=1:ompthreads=18 #PBS -W group_list=gt00 #PBS -l walltime=00:05:00 cd $PBS_O_WORKDIR. /etc/profile.d/modules.sh module load pgi/18.7./run -n 128 -c -20 -nt 18 #! /bin/sh #PBS -q h-lecture #PBS -l select=1:mpiprocs=1:ompthreads=1 #PBS -W group_list=gt00 #PBS -l walltime=00:05:00 cd $PBS_O_WORKDIR openacc_iccg/02_setup. /etc/profile.d/modules.sh module load pgi/18.7 numactl./run -n 128 -c -20 -nt 1 90

91 OpenACC C n ü solver_iccg_mc.c openacc_iccg/02_setup extern int solve_iccg_mc(int N, int NL, int NU, int NPL, int NPU, int *indexl, int *iteml, int *indexu, int *itemu, double *D, double *B, double *X, double *AL, double *AU, int NCOLORtot, int PEsmpTOT, int *SMPindex, int *SMPindexG, double EPS, int *ITR, int *IER) main.c if(solve_iccg_mc(iceltot, NL, NU, NPL, NPU, indexl, iteml, indexu, itemu, D, BFORCE, PHI, AL, AU, NCOLORtot, PEsmpTOT, SMPindex, SMPindexG, EPSICCG, &ITR, &IER)) goto error; solver_iccg_mc.h extern int solve_iccg_mc(int N, int NL, int NU, int NPL, int NPU, int *indexl, int *iteml, int *indexu, int *itemu, double *D, double *B, double *X, double *AL, double *AU, int NCOLORtot, int PEsmpTOT, int *SMPindex, int *SMPindexG, double EPS, int *ITR, int *IER); 91

92 OpenACC n OpenACC solver_iccg_mc.c #pragma omp parallel private (ic, ip1, ip2, i, WVAL, j) for(ic=0; ic<ncolortot; ic++) { ip1 = ic * PEsmpTOT; PEsmpTOT = 1 ip1 = ic ip2 = ic * PEsmpTOT + PEsmpTOT; ip2 = ic+1 #pragma omp for for(i=smpindex[ip1]; i<smpindex[ip2]; i++) { VAL = D[i]; for(j=indexl[i]; j<indexl[i+1]; j++) { VAL = VAL - AL[j]*AL[j] * W[DD][itemL[j] - 1]; W[DD][i] = 1.0 / VAL; OpenACC でのターゲットループ solver_iccg_mc.f!$omp parallel private(ic,ip1,ip2,i,val,k) do ic= 1, NCOLORtot ip1= SMPindex((ic-1)*PEsmpTOT) + 1 ip2= SMPindex((ic-1)*PEsmpTOT + PEsmpTOT)!$omp do do i= ip1, ip2 VAL= D(i) do k= indexl(i-1)+1, indexl(i) VAL= VAL - (AL(k)**2) * W(itemL(k),DD) enddo W(i,DD)= 1.d0/VAL enddo enddo!$omp end parallel ここで同期が必要! 前の色が終わったところで同期が必要となる OpenMPでは暗黙的に同期が入る OpenACCでは同期を取るためにカーネルを閉じるしかない! 92

93 OpenACC solver_iccg_mc.c #pragma omp parallel private (ic, ip1, ip2, i, WVAL, j) for(ic=0; ic<ncolortot; ic++) { ip1 = ic * PEsmpTOT; PEsmpTOT = 1 ip1 = ic ip2 = ic * PEsmpTOT + PEsmpTOT; ip2 = ic+1 #pragma omp for #pragma acc kernels copyin(d[0:n], indexl[0:n+1], AL[0:NPL], iteml[0:npl], SMPindex[0:NCOLORtot*PEsmpTOT] ) copy(w[0:4][0:n]) #pragma acc loop independent for(i=smpindex[ip1]; i<smpindex[ip2]; i++) { VAL = D[i]; #pramga acc loop seq for(j=indexl[i]; j<indexl[i+1]; j++) { VAL = VAL - AL[j]*AL[j] * W[DD][itemL[j] - 1]; W[DD][i] = 1.0 / VAL; 配列のサイズを一々書くのめんどくさい! solver_iccg_mc.f!$omp parallel private(ic,ip1,ip2,i,val,k) do ic= 1, NCOLORtot ip1= SMPindex((ic-1)*PEsmpTOT) + 1 ip2= SMPindex((ic-1)*PEsmpTOT + PEsmpTOT)!$omp do!$acc kernels copyin(d,indexl,al,iteml) copy(w)!$acc loop independent do i= ip1, ip2 VAL= D(i)!$acc loop seq do k= indexl(i-1)+1, indexl(i) このループは短いので逐次計算 ( 長さ 3 or 6) VAL= VAL - (AL(k)**2) * W(itemL(k),DD) enddo W(i,DD)= 1.d0/VAL enddo!$acc end kernels enddo!$omp end parallel 配列のサイズ情報を書く必要はない 93

94 Unified Memory n Unified memory ü CPU GPU ucpu/gpu GPU/CPU ü NVIDIA GPU OpenACC n OpenACC ü PGI compiler -ta=tesla,cc60,managed ü Data Unified memory u OpenACC ü CPU 94

95 Unified Memory OpenACC n openacc_iccg/03_unified C CC = pgcc OPTFLAGS= -O3 mp -acc -Minfo=accel -ta=tesla:cc60 TARGET = run F F90 = pgfortran F90OPTFLAGS= -O3 -acc -Minfo=accel -ta=tesla:cc60 TARGET = run CC = pgcc OPTFLAGS= -O3 -acc -Minfo=accel - ta=tesla:cc60,managed TARGET = run F90 = pgfortran F90OPTFLAGS= -O3 -acc -Minfo=accel -ta=tesla:cc60,managed TARGET = run 95

96 Unified Memory OpenACC solver_iccg_mc.c #pragma omp parallel for private (i) for(i=0; i<n; i++) { X[i] = 0.0; W[1][i] = 0.0; W[2][i] = 0.0; W[3][i] = 0.0 openacc_iccg/03_unified solver_iccg_mc.f!$omp parallel do private(i) do i= 1, N X(i) = 0.d0 W(i,2)= 0.0D0 W(i,3)= 0.0D0 W(i,4)= 0.0D0 W(i,R)= B(i) enddo #pragma omp parallel for private (i) #pragma acc kernels #pragma acc loop independent for(i=0; i<n; i++) { X[i] = 0.0; W[1][i] = 0.0; W[2][i] = 0.0; W[3][i] = 0.0;!$omp parallel do private(i)!$acc kernels!$acc loop independent do i= 1, N X(i) = 0.d0 W(i,2)= 0.0D0 W(i,3)= 0.0D0 W(i,4)= 0.0D0 W(i,R)= B(i) enddo!$acc end kernels 96

97 Unified Memory run.sh.exxxxx ### CMRCM 標準エラー出力 run.sh.oxxxxx ### CM-RCM ### FINAL COLOR NUMBER e-01 sec. (assemble) e e e e e-09 N= e+00 sec. (solver) ### FINAL COLOR NUMBER E-01 sec. (assemble) E E E E E-09 N= E+00 sec. (solver) n n n ü OpenACC ü Unified memory GPU solver CPU 97

98 present solver_iccg_mc.c solver_iccg_mc.f openacc_iccg/04_data_ present #pragma acc enter data copyin(d[:n],indexl[:n+1]) copyin(al[:npl],iteml[:npl],au[:npu]) copyin(indexu[:n+1],itemu[:npu]) copyin(smpindex[0:ncolortot*pesmptot]) create(x[:n],w[:4][:n]) #pragma omp parallel for private (i) #pragma acc kernels present(x,w) #pragma acc loop independent for(i=0; i<n; i++) { X[i] = 0.0; W[1][i] = 0.0; W[2][i] = 0.0; W[3][i] = 0.0;... #pragma acc exit data delete(d[:n],indexl[:n+1],w[:4][:n]) delete(al[:npl],iteml[:npl],au[:npu]) delete(indexu[:n+1],itemu[:npu]) delete(smpindex[0:ncolortot*pesmptot]) copyout(x[:n]) Makefile から maneged を外すのを忘れずに!$acc enter data!$acc& copyin(b,d,indexl,iteml)!$acc& copyin(indexu,itemu,al,au)!$acc& create(x,w)!$omp parallel do private(i)!$acc kernels present(x,w,b)!$acc loop independent do i= 1, N X(i) = 0.d0 W(i,2)= 0.0D0 W(i,3)= 0.0D0 W(i,4)= 0.0D0 W(i,R)= B(i) enddo!$acc end kernels...!$acc exit data!$acc& delete(b,d,indexl,iteml)!$acc& delete(indexu,itemu,al,au,w)!$acc& copyout(x) Data kernels 98

99 n EX1 Makefile INPUT.dat CPU n EX2 (OMP DO ) OpenACC n n CPU n n n EX3 n EX4 n PGI_ACC_TIME export PGI_ACC_TIME=0 ( ) 99

100 n GPU OpenACC n ICCG OpenACC n ICCG OpenACC n kernels n n PGI_ACC_TIME n 100

101 Q & A n 1 n n 101

OpenACCによる並列化

OpenACCによる並列化 実習 OpenACC による ICCG ソルバーの並列化 1 ログイン Reedbush へのログイン $ ssh reedbush.cc.u-tokyo.ac.jp l txxxxx Module のロード $ module load pgi/17.3 cuda ログインするたびに必要です! ワークディレクトリに移動 $ cdw ターゲットプログラム /srcx OpenACC 用のディレクトリの作成

More information

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

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

More information

概要 OpenACC とは OpenACC について OpenMP, CUDA との違い OpenACC の指示文 並列化領域指定指示文 (kernels/parallel) データ移動指示文 ループ指示文 OpenACC の実用例 実習 コンパイラメッセージの見方 OpenACC プログラムの実装

概要 OpenACC とは OpenACC について OpenMP, CUDA との違い OpenACC の指示文 並列化領域指定指示文 (kernels/parallel) データ移動指示文 ループ指示文 OpenACC の実用例 実習 コンパイラメッセージの見方 OpenACC プログラムの実装 第 74 回お試しアカウント付き 並列プログラミング講習会 GPU プログラミング入門 in 名古屋 星野哲也 ( 助教 ) hoshino@cc.u-tokyo.ac.jp 大島聡史 ( 助教 ) ohshima@cc.u-tokyo.ac.jp 2016 年 3 月 14 日 ( 火 ) 東京大学情報基盤センター 概要 OpenACC とは OpenACC について OpenMP, CUDA との違い

More information

スライド 1

スライド 1 GTC Japan 2013 PGI Accelerator Compiler 新 OpenACC 2.0 の機能と PGI アクセラレータコンパイラ 2013 年 7 月 加藤努株式会社ソフテック 本日の話 OpenACC ディレクティブで出来ることを改めて知ろう! OpenACC 1.0 の復習 ディレクティブ操作で出来ることを再確認 OpenACC 2.0 の新機能 プログラミングの自由度の向上へ

More information

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

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

More information

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

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

More information

01_OpenMP_osx.indd

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

More information

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

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

More information

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

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

More information

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション 1 サンプルソースコードは ITO の /home/tmp/gpu 以下に置いてあります 実質的に 演習の答え となるものもあるので注意 PGI compiler 19.4 で実行した場合の出力に準拠 18.10 でも 19.4 でも基本的には同じであるが 18.10 では出力されていた Accelerator kernel generated ( 並列実行カーネルが作成できた旨 ) が出力されなくなったことを反映

More information

Microsoft PowerPoint - GTC2012-SofTek.pptx

Microsoft PowerPoint - GTC2012-SofTek.pptx GTC Japan 2012 PGI Accelerator Compiler 実践! PGI OpenACC ディレクティブを使用したポーティング 2012 年 7 月 加藤努株式会社ソフテック 本日の話 OpenACC によるポーティングの実際 OpenACC ディレクティブ概略説明 Accelerator Programming Model Fortran プログラムによるポーティング ステップ三つのディレクティブの利用性能チューニング

More information

コードのチューニング

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

More information

XACCの概要

XACCの概要 2 global void kernel(int a[max], int llimit, int ulimit) {... } : int main(int argc, char *argv[]){ MPI_Int(&argc, &argc); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); dx

More information

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

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

More information

GPU CUDA CUDA 2010/06/28 1

GPU CUDA CUDA 2010/06/28 1 GPU CUDA CUDA 2010/06/28 1 GPU NVIDIA Mark Harris, Optimizing Parallel Reduction in CUDA http://developer.download.nvidia.com/ compute/cuda/1_1/website/data- Parallel_Algorithms.html#reduction CUDA SDK

More information

( CUDA CUDA CUDA CUDA ( NVIDIA CUDA I

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

More information

Vol.214-HPC-145 No /7/3 C #pragma acc directive-name [clause [[,] clause] ] new-line structured block Fortran!$acc directive-name [clause [[,] c

Vol.214-HPC-145 No /7/3 C #pragma acc directive-name [clause [[,] clause] ] new-line structured block Fortran!$acc directive-name [clause [[,] c Vol.214-HPC-145 No.45 214/7/3 OpenACC 1 3,1,2 1,2 GPU CUDA OpenCL OpenACC OpenACC High-level OpenACC CPU Intex Xeon Phi K2X GPU Intel Xeon Phi 27% K2X GPU 24% 1. TSUBAME2.5 CPU GPU CUDA OpenCL CPU OpenMP

More information

XACC講習会

XACC講習会 www.xcalablemp.org 1 4, int array[max]; #pragma xmp nodes p(*) #pragma xmp template t(0:max-1) #pragma xmp distribute t(block) onto p #pragma xmp align array[i] with t(i) int array[max]; main(int argc,

More information

第12回講義(2019年7月17日)

第12回講義(2019年7月17日) スパコンプログラミング (1)(Ⅰ) 1 OpenACC の紹介 Reedbush-H お試し 東京大学情報基盤センター准教授塙敏博 2019 年 7 月 17 日 ( 水 )10:25 12:10 2019/7/16 スパコンプログラミング (1) (Ⅰ) 講義日程 ( 工学部共通科目 ) 1. 4 月 9 日 : ガイダンス 2. 4 月 16 日 l 並列数値処理の基本演算 ( 座学 ) 3.

More information

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

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

More information

Microsoft PowerPoint - GDEP-GPG_softek_May24-2.pptx

Microsoft PowerPoint - GDEP-GPG_softek_May24-2.pptx G-DEP 第 3 回セミナー PGI OpenACC Compiler PGIコンパイラ使用の実際 新しい OpenACC によるプログラミング 2012 年 5 月 加藤努株式会社ソフテック OpenACC によるプログラミング GPU / Accelerator Computing Model のデファクト スタンダードへ OpenACC Standard 概略説明 Accelerator Programming

More information

02_C-C++_osx.indd

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

More information

DO 時間積分 START 反変速度の計算 contravariant_velocity 移流項の計算 advection_adams_bashforth_2nd DO implicit loop( 陰解法 ) 速度勾配, 温度勾配の計算 gradient_cell_center_surface 速

DO 時間積分 START 反変速度の計算 contravariant_velocity 移流項の計算 advection_adams_bashforth_2nd DO implicit loop( 陰解法 ) 速度勾配, 温度勾配の計算 gradient_cell_center_surface 速 1 1, 2 1, 2 3 2, 3 4 GP LES ASUCA LES NVIDIA CUDA LES 1. Graphics Processing Unit GP General-Purpose SIMT Single Instruction Multiple Threads 1 2 3 4 1),2) LES Large Eddy Simulation 3) ASUCA 4) LES LES

More information

Slide 1

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

More information

XcalableMP入門

XcalableMP入門 XcalableMP 1 HPC-Phys@, 2018 8 22 XcalableMP XMP XMP Lattice QCD!2 XMP MPI MPI!3 XMP 1/2 PCXMP MPI Fortran CCoarray C++ MPIMPI XMP OpenMP http://xcalablemp.org!4 XMP 2/2 SPMD (Single Program Multiple Data)

More information

GPU GPU CPU CPU CPU GPU GPU N N CPU ( ) 1 GPU CPU GPU 2D 3D CPU GPU GPU GPGPU GPGPU 2 nvidia GPU CUDA 3 GPU 3.1 GPU Core 1

GPU GPU CPU CPU CPU GPU GPU N N CPU ( ) 1 GPU CPU GPU 2D 3D CPU GPU GPU GPGPU GPGPU 2 nvidia GPU CUDA 3 GPU 3.1 GPU Core 1 GPU 4 2010 8 28 1 GPU CPU CPU CPU GPU GPU N N CPU ( ) 1 GPU CPU GPU 2D 3D CPU GPU GPU GPGPU GPGPU 2 nvidia GPU CUDA 3 GPU 3.1 GPU Core 1 Register & Shared Memory ( ) CPU CPU(Intel Core i7 965) GPU(Tesla

More information

演習1: 演習準備

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

More information

概要 目的 CUDA Fortran の利用に関する基本的なノウハウを提供する 本チュートリアル受講後は Web 上で公開されている資料等を参照しながら独力で CUDA Fortran が利用できることが目標 対象 CUDA Fortran の利用に興味を抱いている方 前提とする知識 Fortran

概要 目的 CUDA Fortran の利用に関する基本的なノウハウを提供する 本チュートリアル受講後は Web 上で公開されている資料等を参照しながら独力で CUDA Fortran が利用できることが目標 対象 CUDA Fortran の利用に興味を抱いている方 前提とする知識 Fortran CUDA Fortran チュートリアル 2010 年 9 月 29 日 NEC 概要 目的 CUDA Fortran の利用に関する基本的なノウハウを提供する 本チュートリアル受講後は Web 上で公開されている資料等を参照しながら独力で CUDA Fortran が利用できることが目標 対象 CUDA Fortran の利用に興味を抱いている方 前提とする知識 Fortran を用いた Linux

More information

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

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

More information

NUMAの構成

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

More information

Microsoft PowerPoint - 03_What is OpenMP 4.0 other_Jan18

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

More information

OpenMP¤òÍѤ¤¤¿ÊÂÎó·×»»¡Ê£±¡Ë

OpenMP¤òÍѤ¤¤¿ÊÂÎó·×»»¡Ê£±¡Ë 2011 5 26 scalar Open MP Hello World Do (omp do) (omp workshare) (shared, private) π (reduction) scalar magny-cours, 48 scalar scalar 1 % scp. ssh / authorized keys 133. 30. 112. 246 2 48 % ssh 133.30.112.246

More information

OpenMP¤òÍѤ¤¤¿ÊÂÎó·×»»¡Ê£±¡Ë

OpenMP¤òÍѤ¤¤¿ÊÂÎó·×»»¡Ê£±¡Ë 2012 5 24 scalar Open MP Hello World Do (omp do) (omp workshare) (shared, private) π (reduction) PU PU PU 2 16 OpenMP FORTRAN/C/C++ MPI OpenMP 1997 FORTRAN Ver. 1.0 API 1998 C/C++ Ver. 1.0 API 2000 FORTRAN

More information

Slide 1

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

More information

double float

double float 2015 3 13 1 2 2 3 2.1.......................... 3 2.2............................. 3 3 4 3.1............................... 4 3.2 double float......................... 5 3.3 main.......................

More information

OpenACC入門

OpenACC入門 第 87 回 OpenMP/OpenACC による マルチコア メニィコア並列プログラミング 入門 星野哲也 (hoshino@cc.u-tokyo.ac.jp) 東京大学情報基盤センター 2017/11/1 ( 水 ) スケジュール (11 月 1 日 ) 13:00 14:30 GPUについて GPUのアーキテクチャ GPUプログラミングで気をつけるべきこと OpenACC OpenMPとOpenACCの違い

More information

1 OpenCL OpenCL 1 OpenCL GPU ( ) 1 OpenCL Compute Units Elements OpenCL OpenCL SPMD (Single-Program, Multiple-Data) SPMD OpenCL work-item work-group N

1 OpenCL OpenCL 1 OpenCL GPU ( ) 1 OpenCL Compute Units Elements OpenCL OpenCL SPMD (Single-Program, Multiple-Data) SPMD OpenCL work-item work-group N GPU 1 1 2 1, 3 2, 3 (Graphics Unit: GPU) GPU GPU GPU Evaluation of GPU Computing Based on An Automatic Program Generation Technology Makoto Sugawara, 1 Katsuto Sato, 1 Kazuhiko Komatsu, 2 Hiroyuki Takizawa

More information

OpenMP/OpenACC によるマルチコア メニィコア並列プログラミング入門 Fortran 編第 Ⅳ 部 :OpenMP による並列化 + 演習 中島研吾 東京大学情報基盤センター

OpenMP/OpenACC によるマルチコア メニィコア並列プログラミング入門 Fortran 編第 Ⅳ 部 :OpenMP による並列化 + 演習 中島研吾 東京大学情報基盤センター OpenMP/OpenACC によるマルチコア メニィコア並列プログラミング入門 Fortran 編第 Ⅳ 部 :OpenMP による並列化 + 演習 中島研吾 東京大学情報基盤センター OMP-3 1 OpenMP 並列化 L2-sol を OpenMP によって並列化する 並列化にあたってはスレッド数を PEsmpTOT によってプログラム内で調節できる方法を適用する 基本方針 同じ 色 ( または

More information

1 4 1.1........................................... 4 1.2.................................. 4 1.3................................... 4 2 5 2.1 GPU.....

1 4 1.1........................................... 4 1.2.................................. 4 1.3................................... 4 2 5 2.1 GPU..... CPU GPU N Q07-065 2011 2 17 1 1 4 1.1........................................... 4 1.2.................................. 4 1.3................................... 4 2 5 2.1 GPU...........................................

More information

XMPによる並列化実装2

XMPによる並列化実装2 2 3 C Fortran Exercise 1 Exercise 2 Serial init.c init.f90 XMP xmp_init.c xmp_init.f90 Serial laplace.c laplace.f90 XMP xmp_laplace.c xmp_laplace.f90 #include int a[10]; program init integer

More information

untitled

untitled Fortran90 ( ) 17 12 29 1 Fortran90 Fortran90 FORTRAN77 Fortran90 1 Fortran90 module 1.1 Windows Windows UNIX Cygwin (http://www.cygwin.com) C\: Install Cygwin f77 emacs latex ps2eps dvips Fortran90 Intel

More information

HPC143

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

More information

openmp1_Yaguchi_version_170530

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

More information

IPSJ SIG Technical Report Vol.2013-HPC-138 No /2/21 GPU CRS 1,a) 2,b) SpMV GPU CRS SpMV GPU NVIDIA Kepler CUDA5.0 Fermi GPU Kepler Kepler Tesla

IPSJ SIG Technical Report Vol.2013-HPC-138 No /2/21 GPU CRS 1,a) 2,b) SpMV GPU CRS SpMV GPU NVIDIA Kepler CUDA5.0 Fermi GPU Kepler Kepler Tesla GPU CRS 1,a),b) SpMV GPU CRS SpMV GPU NVIDIA Kepler CUDA5.0 Fermi GPU Kepler Kepler Tesla K0 CUDA5.0 cusparse CRS SpMV 00 1.86 177 1. SpMV SpMV CRS Compressed Row Storage *1 SpMV GPU GPU NVIDIA Kepler

More information

<4D F736F F F696E74202D D F95C097F D834F E F93FC96E5284D F96E291E85F8DE391E52E >

<4D F736F F F696E74202D D F95C097F D834F E F93FC96E5284D F96E291E85F8DE391E52E > SX-ACE 並列プログラミング入門 (MPI) ( 演習補足資料 ) 大阪大学サイバーメディアセンター日本電気株式会社 演習問題の構成 ディレクトリ構成 MPI/ -- practice_1 演習問題 1 -- practice_2 演習問題 2 -- practice_3 演習問題 3 -- practice_4 演習問題 4 -- practice_5 演習問題 5 -- practice_6

More information

第5回お試しアカウント付き並列プログラミング講習会

第5回お試しアカウント付き並列プログラミング講習会 qstat -l ID (qstat -f) qscript ID BATCH REQUEST: 253443.batch1 Name: test.sh Owner: uid=32637, gid=30123 Priority: 63 State: 1(RUNNING) Created at: Tue Jun 30 05:36:24 2009 Started at: Tue Jun 30 05:36:27

More information

スパコンに通じる並列プログラミングの基礎

スパコンに通じる並列プログラミングの基礎 2018.09.10 furihata@cmc.osaka-u.ac.jp ( ) 2018.09.10 1 / 59 furihata@cmc.osaka-u.ac.jp ( ) 2018.09.10 2 / 59 Windows, Mac Unix 0444-J furihata@cmc.osaka-u.ac.jp ( ) 2018.09.10 3 / 59 Part I Unix GUI CUI:

More information

OpenMP (1) 1, 12 1 UNIX (FUJITSU GP7000F model 900), 13 1 (COMPAQ GS320) FUJITSU VPP5000/64 1 (a) (b) 1: ( 1(a))

OpenMP (1) 1, 12 1 UNIX (FUJITSU GP7000F model 900), 13 1 (COMPAQ GS320) FUJITSU VPP5000/64 1 (a) (b) 1: ( 1(a)) OpenMP (1) 1, 12 1 UNIX (FUJITSU GP7000F model 900), 13 1 (COMPAQ GS320) FUJITSU VPP5000/64 1 (a) (b) 1: ( 1(a)) E-mail: {nanri,amano}@cc.kyushu-u.ac.jp 1 ( ) 1. VPP Fortran[6] HPF[3] VPP Fortran 2. MPI[5]

More information

スパコンに通じる並列プログラミングの基礎

スパコンに通じる並列プログラミングの基礎 2018.06.04 2018.06.04 1 / 62 2018.06.04 2 / 62 Windows, Mac Unix 0444-J 2018.06.04 3 / 62 Part I Unix GUI CUI: Unix, Windows, Mac OS Part II 2018.06.04 4 / 62 0444-J ( : ) 6 4 ( ) 6 5 * 6 19 SX-ACE * 6

More information

1.overview

1.overview 村井均 ( 理研 ) 2 はじめに 規模シミュレーションなどの計算を うためには クラスタのような分散メモリシステムの利 が 般的 並列プログラミングの現状 半は MPI (Message Passing Interface) を利 MPI はプログラミングコストが きい 標 性能と 産性を兼ね備えた並列プログラミング 語の開発 3 並列プログラミング 語 XcalableMP 次世代並列プログラミング

More information

名称 : 日本 GPU コンピューティングパートナーシップ (G-DEP) 所在 : 東京都文京区本郷 7 丁目 3 番 1 号東京大学アントレプレナープラザ, 他工場 URL アライアンスパートナー コアテクノロジーパートナー NVIDIA JAPAN ソリュ

名称 : 日本 GPU コンピューティングパートナーシップ (G-DEP) 所在 : 東京都文京区本郷 7 丁目 3 番 1 号東京大学アントレプレナープラザ, 他工場 URL   アライアンスパートナー コアテクノロジーパートナー NVIDIA JAPAN ソリュ GPUDirect の現状整理 multi-gpu に取組むために G-DEP チーフエンジニア河井博紀 (kawai@gdep.jp) 名称 : 日本 GPU コンピューティングパートナーシップ (G-DEP) 所在 : 東京都文京区本郷 7 丁目 3 番 1 号東京大学アントレプレナープラザ, 他工場 URL http://www.gdep.jp アライアンスパートナー コアテクノロジーパートナー

More information

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

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

More information

1 return main() { main main C 1 戻り値の型 関数名 引数 関数ブロックをあらわす中括弧 main() 関数の定義 int main(void){ printf("hello World!!\n"); return 0; 戻り値 1: main() 2.2 C main

1 return main() { main main C 1 戻り値の型 関数名 引数 関数ブロックをあらわす中括弧 main() 関数の定義 int main(void){ printf(hello World!!\n); return 0; 戻り値 1: main() 2.2 C main C 2007 5 29 C 1 11 2 2.1 main() 1 FORTRAN C main() main main() main() 1 return 1 1 return main() { main main C 1 戻り値の型 関数名 引数 関数ブロックをあらわす中括弧 main() 関数の定義 int main(void){ printf("hello World!!\n"); return

More information

I I / 47

I I / 47 1 2013.07.18 1 I 2013 3 I 2013.07.18 1 / 47 A Flat MPI B 1 2 C: 2 I 2013.07.18 2 / 47 I 2013.07.18 3 / 47 #PJM -L "rscgrp=small" π-computer small: 12 large: 84 school: 24 84 16 = 1344 small school small

More information

スパコンに通じる並列プログラミングの基礎

スパコンに通じる並列プログラミングの基礎 2016.06.06 2016.06.06 1 / 60 2016.06.06 2 / 60 Windows, Mac Unix 0444-J 2016.06.06 3 / 60 Part I Unix GUI CUI: Unix, Windows, Mac OS Part II 0444-J 2016.06.06 4 / 60 ( : ) 6 6 ( ) 6 10 6 16 SX-ACE 6 17

More information

ex01.dvi

ex01.dvi ,. 0. 0.0. C () /******************************* * $Id: ex_0_0.c,v.2 2006-04-0 3:37:00+09 naito Exp $ * * 0. 0.0 *******************************/ #include int main(int argc, char **argv) double

More information

untitled

untitled A = QΛQ T A n n Λ Q A = XΛX 1 A n n Λ X GPGPU A 3 T Q T AQ = T (Q: ) T u i = λ i u i T {λ i } {u i } QR MR 3 v i = Q u i A {v i } A n = 9000 Quad Core Xeon 2 LAPACK (4/3) n 3 O(n 2 ) O(n 3 ) A {v i }

More information

untitled

untitled A = QΛQ T A n n Λ Q A = XΛX 1 A n n Λ X GPGPU A 3 T Q T AQ = T (Q: ) T u i = λ i u i T {λ i } {u i } QR MR 3 v i = Q u i A {v i } A n = 9000 Quad Core Xeon 2 LAPACK (4/3) n 3 O(n 2 ) O(n 3 ) A {v i }

More information

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

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

More information

C

C C 1 2 1.1........................... 2 1.2........................ 2 1.3 make................................................ 3 1.4....................................... 5 1.4.1 strip................................................

More information

(Basic Theory of Information Processing) Fortran Fortan Fortan Fortan 1

(Basic Theory of Information Processing) Fortran Fortan Fortan Fortan 1 (Basic Theory of Information Processing) Fortran Fortan Fortan Fortan 1 17 Fortran Formular Tranlator Lapack Fortran FORTRAN, FORTRAN66, FORTRAN77, FORTRAN90, FORTRAN95 17.1 A Z ( ) 0 9, _, =, +, -, *,

More information

¥Ñ¥Ã¥±¡¼¥¸ Rhpc ¤Î¾õ¶·

¥Ñ¥Ã¥±¡¼¥¸ Rhpc ¤Î¾õ¶· Rhpc COM-ONE 2015 R 27 12 5 1 / 29 1 2 Rhpc 3 forign MPI 4 Windows 5 2 / 29 1 2 Rhpc 3 forign MPI 4 Windows 5 3 / 29 Rhpc, R HPC Rhpc, ( ), snow..., Rhpc worker call Rhpc lapply 4 / 29 1 2 Rhpc 3 forign

More information

Microsoft Word - openmp-txt.doc

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

More information

Slide 1

Slide 1 GPUコンピューティング入門 2015.08.26 エヌビディア合同会社 CUDAエンジニア 村上真奈 エヌビディアのGPUについて (20 分 ) GPUコンピューティングとは?(10 分 ) OpenACC 入門 (90 分 ) CUDA 入門 (90 分 ) Agenda 2 エヌビディアのGPUについて (20 分 ) GPUコンピューティングとは?(10 分 ) OpenACC 入門 (90

More information

MPI usage

MPI usage MPI (Version 0.99 2006 11 8 ) 1 1 MPI ( Message Passing Interface ) 1 1.1 MPI................................. 1 1.2............................... 2 1.2.1 MPI GATHER.......................... 2 1.2.2

More information

memo

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

More information

スライド 1

スライド 1 GPU クラスタによる格子 QCD 計算 広大理尾崎裕介 石川健一 1.1 Introduction Graphic Processing Units 1 チップに数百個の演算器 多数の演算器による並列計算 ~TFLOPS ( 単精度 ) CPU 数十 GFLOPS バンド幅 ~100GB/s コストパフォーマンス ~$400 GPU の開発環境 NVIDIA CUDA http://www.nvidia.co.jp/object/cuda_home_new_jp.html

More information

memo

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

More information

all.dvi

all.dvi fortran 1996 4 18 2007 6 11 2012 11 12 1 3 1.1..................................... 3 1.2.............................. 3 2 fortran I 5 2.1 write................................ 5 2.2.................................

More information

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

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

More information

untitled

untitled GPGPU NVIDACUDA Learn More about CUDA - NVIDIA http://www.nvidia.co.jp/object/cuda_education_jp.html NVIDIA CUDA programming Guide CUDA http://www.sintef.no/upload/ikt/9011/simoslo/evita/2008/seland.pdf

More information

インテル(R) Visual Fortran Composer XE 2013 Windows版 入門ガイド

インテル(R) Visual Fortran Composer XE 2013 Windows版 入門ガイド Visual Fortran Composer XE 2013 Windows* エクセルソフト株式会社 www.xlsoft.com Rev. 1.1 (2012/12/10) Copyright 1998-2013 XLsoft Corporation. All Rights Reserved. 1 / 53 ... 3... 4... 4... 5 Visual Studio... 9...

More information

Microsoft PowerPoint - OpenMP入門.pptx

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

More information

GPU n Graphics Processing Unit CG CAD

GPU n Graphics Processing Unit CG CAD GPU 2016/06/27 第 20 回 GPU コンピューティング講習会 ( 東京工業大学 ) 1 GPU n Graphics Processing Unit CG CAD www.nvidia.co.jp www.autodesk.co.jp www.pixar.com GPU n GPU ü n NVIDIA CUDA ü NVIDIA GPU ü OS Linux, Windows, Mac

More information

HPC146

HPC146 2 3 4 5 6 int array[16]; #pragma xmp nodes p(4) #pragma xmp template t(0:15) #pragma xmp distribute t(block) on p #pragma xmp align array[i] with t(i) array[16] 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Node

More information

PGIコンパイラ導入手順

PGIコンパイラ導入手順 1 注意この資料は PGI compiler 18.10 が最新であるときに作成した資料を元にしています PGI compiler 19.4 がリリースされましたが インストール手順や利用手順は 18.10 と変わりません 資料中の 1810 を 194 に 18.10 を 19.4 に読み替えてください 2019 年 6 月版 2 大きく分けて以下の 3 つの方法が利用可能 1. 手元のウェブブラウザでダウンロードして

More information

Microsoft PowerPoint - GPU_computing_2013_01.pptx

Microsoft PowerPoint - GPU_computing_2013_01.pptx GPU コンピューティン No.1 導入 東京工業大学 学術国際情報センター 青木尊之 1 GPU とは 2 GPGPU (General-purpose computing on graphics processing units) GPU を画像処理以外の一般的計算に使う GPU の魅力 高性能 : ハイエンド GPU はピーク 4 TFLOPS 超 手軽さ : 普通の PC にも装着できる 低価格

More information

Intel® Compilers Professional Editions

Intel® Compilers Professional Editions 2007 6 10.0 * 10.0 6 5 Software &Solutions group 10.0 (SV) C++ Fortran OpenMP* OpenMP API / : 200 C/C++ Fortran : OpenMP : : : $ cat -n main.cpp 1 #include 2 int foo(const char *); 3 int main()

More information

2ndD3.eps

2ndD3.eps CUDA GPGPU 2012 UDX 12/5/24 p. 1 FDTD GPU FDTD GPU FDTD FDTD FDTD PGI Acceralator CUDA OpenMP Fermi GPU (Tesla C2075/C2070, GTX 580) GT200 GPU (Tesla C1060, GTX 285) PC GPGPU 2012 UDX 12/5/24 p. 2 FDTD

More information

NUMAの構成

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

More information

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

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

More information

11042 計算機言語7回目 サポートページ:

11042 計算機言語7回目  サポートページ: 11042 7 :https://goo.gl/678wgm November 27, 2017 10/2 1(print, ) 10/16 2(2, ) 10/23 (3 ) 10/31( ),11/6 (4 ) 11/13,, 1 (5 6 ) 11/20,, 2 (5 6 ) 11/27 (7 12/4 (9 ) 12/11 1 (10 ) 12/18 2 (10 ) 12/25 3 (11

More information

第9回 配列(array)型の変数

第9回 配列(array)型の変数 第 12 回 配列型の変数 情報処理演習 ( テキスト : 第 4 章, 第 8 章 ) 今日の内容 1. 配列の必要性 2. 配列の宣言 3. 配列変数のイメージ 4. 配列変数を使用した例 5. 範囲を超えた添字を使うと? 6. 多次元配列変数 7. 多次元配列変数を使用した例 8. データのソーティング 9. 今日の練習問題 多数のデータ処理 1. 配列の必要性 ( テキスト 31 ページ )

More information

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

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

More information

OpenMPプログラミング

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

More information

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

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

More information

ストリームを用いたコンカレントカーネルプログラミングと最適化 エヌビディアジャパン CUDAエンジニア森野慎也 GTC Japan 2014

ストリームを用いたコンカレントカーネルプログラミングと最適化 エヌビディアジャパン CUDAエンジニア森野慎也 GTC Japan 2014 ストリームを用いたコンカレントカーネルプログラミングと最適化 エヌビディアジャパン CUDAエンジニア森野慎也 GTC Japan 2014 コンカレントな処理の実行 システム内部の複数の処理を 平行に実行する CPU GPU メモリ転送 カーネル実行 複数のカーネル間 ストリーム GPU 上の処理キュー カーネル実行 メモリ転送の並列性 実行順序 DEFAULT STREAM Stream : GPU

More information

コンピュータ概論

コンピュータ概論 4.1 For Check Point 1. For 2. 4.1.1 For (For) For = To Step (Next) 4.1.1 Next 4.1.1 4.1.2 1 i 10 For Next Cells(i,1) Cells(1, 1) Cells(2, 1) Cells(10, 1) 4.1.2 50 1. 2 1 10 3. 0 360 10 sin() 4.1.2 For

More information

memo

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

More information

II 3 yacc (2) 2005 : Yacc 0 ~nakai/ipp2 1 C main main 1 NULL NULL for 2 (a) Yacc 2 (b) 2 3 y

II 3 yacc (2) 2005 : Yacc 0 ~nakai/ipp2 1 C main main 1 NULL NULL for 2 (a) Yacc 2 (b) 2 3 y II 3 yacc (2) 2005 : Yacc 0 ~nakai/ipp2 1 C 1 6 9 1 main main 1 NULL NULL 1 15 23 25 48 26 30 32 36 38 43 45 47 50 52 for 2 (a) 2 2 1 Yacc 2 (b) 2 3 yytext tmp2 ("") tmp2->next->word tmp2 yytext tmp2->next->word

More information

ex01.dvi

ex01.dvi ,. 0. 0.0. C () /******************************* * $Id: ex_0_0.c,v.2 2006-04-0 3:37:00+09 naito Exp $ * * 0. 0.0 *******************************/ #include int main(int argc, char **argv) { double

More information

CudaWaveField

CudaWaveField CudaWaveField 2012 3 22 2 CudaWaveField Rel 1.0.0 Rel 1.0 CudaWaveField ( cwfl) / cwfl cwfl http://www.laser.ee.kansai-u.ac.jp/wavefieldtools Note Acrobat Reader 3 I CudaWaveField 9 1 11 1.1 CudaWaveField......................

More information

Microsoft PowerPoint - 阪大CMSI pptx

Microsoft PowerPoint - 阪大CMSI pptx 内容に関する質問は katagiri@cc.u-tokyo.ac.jp まで 第 3 回 OpenMP の基礎 東京大学情報基盤センター 片桐孝洋 1 講義日程と内容について (1 学期 : 木曜 3 限 ) 第 1 回 : プログラム高速化の基礎 2015 年 4 月 9 日 イントロダクション ループアンローリング キャッシュブロック化 数値計算ライブラリの利用 その他第 2 回 :MPIの基礎

More information

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

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

More information

pptx

pptx iphone 2010 8 18 C xkozima@myu.ac.jp C Hello, World! Hello World hello.c! printf( Hello, World!\n );! os> ls! hello.c! os> cc hello.c o hello! os> ls! hello!!hello.c! os>./hello! Hello, World!! os>! os>

More information

Slide 1

Slide 1 OpenACC CUDA による GPU コンピューティング Akira Naruse, 19 th Jul. 2018 成瀬彰 (Naruse, Akira) 自己紹介 2013 年 ~: NVIDIA シニア デベローパーテクノロジー エンジニア 1996~2013 年 : 富士通研究所 研究員など 専門 興味 : 並列処理 性能最適化 スパコン HPC GPU コンピューティング DeepLearning

More information

GPGPU

GPGPU GPGPU 2013 1008 2015 1 23 Abstract In recent years, with the advance of microscope technology, the alive cells have been able to observe. On the other hand, from the standpoint of image processing, the

More information

Microsoft PowerPoint - KHPCSS pptx

Microsoft PowerPoint - KHPCSS pptx KOBE HPC サマースクール 2018( 初級 ) 9. 1 対 1 通信関数, 集団通信関数 2018/8/8 KOBE HPC サマースクール 2018 1 2018/8/8 KOBE HPC サマースクール 2018 2 MPI プログラム (M-2):1 対 1 通信関数 問題 1 から 100 までの整数の和を 2 並列で求めなさい. プログラムの方針 プロセス0: 1から50までの和を求める.

More information

PowerPoint Presentation

PowerPoint Presentation ヘテロジニアスな環境におけるソフトウェア開発 Agenda 今日の概要 ヘテロジニアスな環境の登場 ホモジニアスからヘテロジニアスへ ヘテロジニアスなアーキテクチャ GPU CUDA OpenACC, XeonPhi 自分のプログラムを理解するために デバッガ 共通の操作体験 TotalView 続きはブースで より速く ホモジーニアスな並列 HPC 銀河生成 金融のリスク計算 車の衝突解析 製薬

More information