CUDA 連携とライブラリの活用 2
|
|
|
- ひでか はかまや
- 7 years ago
- Views:
Transcription
1 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 連携とライブラリの活用 )
2 CUDA 連携とライブラリの活用 2
3 3 OpenACC 簡単にGPUプログラムが作成できる それなりの性能が得られる 様々な環境で利用できる CUDA OpenACCと比べると使用が大変だが より高い性能が期待できる ( 基本的に )NVIDIA GPU 専用 OpenACC プログラムの一部を CUDA 化することで簡単さと高性能を両立できるのでは? 誰かが書いた ( 公開している )CUDAプログラム( 関数 ライブラリ ) を自分のOpenACCプログラムから使わせてもらう 自分が作成したOpenACCプログラムの一部をCUDAで高速化する
4 4 NVIDIA GPU のハードウェアアーキテクチャに対応した言語 適切な記述をすることでNVIDIA GPUの性能を引き出せる可能性がある C 言語版はCUDA CとしてNVIDIAが提供 開発環境は無償 Fortran 版はCUDA FortranとしてPGIが提供 PGIコンパイラが必要 無料プランも有 言語拡張仕様 コンパイラ ライブラリを提供 言語拡張 :GPUカーネルや使用するメモリの種類を明示する記述 コンパイラ :nvcc ライブラリ : 数値計算ライブラリや機械学習ライブラリなど GPU カーネルを動かす単位は関数 関数単位で並列度を指定してGPUカーネルを起動 グローバルメモリに置かれたデータのみが関数間で引き継がれる
5 int main(int argc, char **argv) { int i, N; float *A, *B, *C; float *da, *db, *dc; 5 cuda_c.cu global void gpukernel (int N, float *C, float *A, float *B) { int id = blockidx.x*blockdim.x + threadidx.x; if(id<n)c[id] += A[id] * B[id]; GPU 上の各計算コアが行う処理を global void 関数として記述 ( 右上へ続く ) N = 128; A = (float*)malloc(sizeof(float)*n); B = (float*)malloc(sizeof(float)*n); C = (float*)malloc(sizeof(float)*n); for(i=0;i<n;i++){ C[i] = 0.0f; B[i] = 2.0f; A[i] = (float)(i+1)/(float)(n); cudamalloc((void**)&da, sizeof(float)*n); cudamalloc((void**)&db, sizeof(float)*n); cudamalloc((void**)&dc, sizeof(float)*n); cudamemcpy(da, A, sizeof(float)*n, cudamemcpyhosttodevice); cudamemcpy(db, B, sizeof(float)*n, cudamemcpyhosttodevice); cudamemcpy(dc, C, sizeof(float)*n, cudamemcpyhosttodevice); 典型的 CUDA Cプログラムの処理の流れ 1. GPU 上のメモリを確保 2. CPUからGPUへのデータ転送 3. 特殊な記法でGPUカーネルを起動 4. GPUからCPUへのデータ転送 5. GPU 上のメモリを破棄 (1,2,4,5は用意されている専用の関数によって行う ) dim3 grids; dim3 blocks; grids = dim3(4, 1, 1); blocks = dim3(64, 1,1); gpukernel<<<grids,blocks>>>(n, dc, da, db); cudamemcpy(c, dc, sizeof(float)*n, cudamemcpydevicetohost); cudafree(da); cudafree(db); cudafree(dc); free(a); free(b); free(c); return 0; nvcc でコンパイルして実行する $ nvcc cuda_c.cu;./a.out 並列度は GPU カーネル呼び出し時に個別に指定
6 6 cuda_f.cuf module gpukernel contains attributes(global) subroutine gpukernel(n, C, A, B) integer,value :: ID, N real(kind=4), device, dimension(n), intent(in) :: A, B real(kind=4), device, dimension(n), intent(inout) :: C ID = (blockidx%x 1)*blockDim%x + threadidx%x if(id.le.n)then C(ID) = C(ID) + A(ID) * B(ID) endif end subroutine gpukernel end module gpukernel GPU 上の各計算コアが行う処理を attribute(global) サブルーチン関数として記述 ( 右上へ続く ) CUDA Fortranプログラムの方が少し簡単 CPU 上の配列とGPU 上の配列を明示的に宣言できるため データのコピーが自動的に行われる program main use cudafor use gpukernel implicit none real(4), allocatable, dimension(:) :: A, B, C real(4), allocatable, dimension(:),device :: da, db, dc integer :: I, N type(dim3) :: dimgrid, dimblock N = 128 allocate(a(n), B(N), C(N)) allocate(da(n), db(n), dc(n)) C = 0.0; B = 2.0 do I=1, N A(I) = real(i)/real(n) enddo da = A; db = B; dc = C dimgrid = dim3(2,1,1) dimblock = dim3(64,1,1) call gpukernel<<<dimgrid, dimblock>>>(n, dc, da, db) C = dc cudafor モジュールを使う CPU から GPU へのデータ転送 GPU から CPU へのデータ転送 deallocate(da, db, dc); deallocate(a, B, C) end program main -Mcuda を指定してコンパイルして実行する $ pgf90 -Mcuda cuda_f.cuf;./a.out
7 7 そもそも OpenACC 指示文を含むソースコードとCUDA 記法を含むソースコードを分けておいて個別にコンパイルし 1 つのプログラムにまとめて使うこと自体は可能 単純にOpenACCとCUDAのソース ( 関数 ) を組み合わせて利用した場合 OpenACCとCUDAを行き来する度にデータのコピーが必要になってしまい性能低下要因となる OpenACCによるデータ送受信 (data 指示文による処理 ) と CUDAにおけるデータの扱い ( 接頭辞やAPIによる指定と処理 ) の橋渡し役が必要
8 8 C 言語ベースの場合 Fortran ベースの場合 #pragma acc enter data copyin( ) #pragma acc kernels OpenACCによる計算 #pragma acc end kernels!$acc enter data copyin( )!$acc kernels!$acc end kernels CUDA による計算 #pragma acc exit data copyout( )!$acc exit data copyout( ) 一つの data 指示文の中では OpenACC カーネルと CUDA カーネルでデータを共有させたい
9 9 GPU 上に存在するデータ ( 配列 ) の存在を伝えるための指示文を用いる 使い方 acc host_data use_device( 対象とする配列名 )
10 10 cudakernel.cu global void gpukernel(int N, float *C, float *A, float *B) { int id = blockidx.x*blockdim.x + threadidx.x; C[id] += A[id] * B[id]; GPU カーネルは CUDA C のみの場合と同様 extern "C" void gpukernel_wrapper(int N, float *C, float *A, float *B) { dim3 grids; dim3 blocks; grids = dim3(2, 1, 1); blocks = dim3(64, 1,1); gpukernel<<<grids,blocks>>>(n, C, A, B); GPU カーネルを起動する関数 C++ ではなく C から使う場合は extern C が必要 CPU-GPU 間のデータ転送については何も記述しなくて良い
11 11 acc_main.c OpenACC CUDA #include <stdio.h> extern void gpukernel_wrapper(int N, float *C, float *A, float *B); int main(int argc, char **argv){ int i, N; float *A, *B, *C; N = 128; A = (float*)malloc(sizeof(float)*n); B = (float*)malloc(sizeof(float)*n); C = (float*)malloc(sizeof(float)*n); for(i=0;i<n;i++){ C[i] = 0.0f; B[i] = 2.0f; A[i] = (float)(i+1)/(float)(n); #pragma acc enter data copyin(a[0:n],b[0:n],c[0:n]) #pragma acc kernels present(a,b,c) #pragma acc loop independent for(i=0; i<n; i++){ C[i] += A[i] * B[i]; #pragma acc host_data use_device(a,b,c) { gpukernel_wrapper(n, C, A, B); #pragma acc exit data copyout(c[0:n]) free(a); free(b); free(c); return 0; GPU カーネルを起動する関数 を実行することで GPU を動かしている
12 12 CUDA C 部分はnvccでコンパイルする必要がある点に注意 最低限必要な引数指定などの例 nvcc c cudakernel.cu pgcc acc c acc_main.c pgcc Mcuda acc cudakernel.o acc_main.o 最適化オプションなどを加えた例 -Mcuda と -acc 両方の指定が必要なところに注意する nvcc O2 gencode arch=compute_60,code= "sm_60,compute_60 c cudakernel.cu pgcc acc O2 ta=tesla,cc60 Minfo c acc_main.c pgcc Mcuda acc cudakernel.o acc_main.o 実行./a.out
13 13 cudakernel.cuf module gpukernel contains attributes(global) subroutine gpukernel(n, C, A, B) integer,value :: ID, N real(kind=4), device, dimension(n), intent(in) :: A, B real(kind=4), device, dimension(n), intent(inout) :: C ID = (blockidx%x 1)*blockDim%x + threadidx%x if(id.le.n)then C(ID) = C(ID) + A(ID) * B(ID) endif end subroutine gpukernel GPU カーネルは CUDA Fortran と同様 subroutine gpukernel_wrapper(n, C, A, B) use cudafor integer, intent(in) :: N real(kind=4), device, dimension(n), intent(in) :: A, B real(kind=4), device, dimension(n), intent(inout) :: C type(dim3) :: dimgrid, dimblock dimgrid = dim3(2,1,1) dimblock = dim3(64,1,1) call gpukernel<<<dimgrid, dimblock>>>(n, C, A, B) end subroutine gpukernel_wrapper end module どちらも device による指定は必要 GPUカーネルを起動する関数 CPU-GPU 間のデータ転送については何も記述していない
14 14 acc_main.f90 OpenACC CUDA program main use gpukernel implicit none real(4), allocatable, dimension(:) :: A, B, C integer :: I, N N = 128 allocate(a(n), B(N), C(N)) C = 0.0; B = 2.0 do I=1, N A(I) = real(i)/real(n) enddo!$acc enter data copyin(a(1:n), B(1:N), C(1:N))!$acc kernels!$acc loop do I=1, N C(I) = C(I) + A(I) * B(I) enddo!$acc end kernels!$acc host_data use_device(a, B, C) call gpukernel_wrapper(n, C, A, B)!$acc end host_data!$acc exit data copyout(c(1:n)) deallocate(a, B, C) end program main GPU カーネルを起動する関数 を実行することで GPU を動かしている
15 15 nvccは使わない 最低限必要な引数指定などの例 pgf90 Mcuda c cudakernel.cuf pgf90 acc c acc_main.f90 pgf90 Mcuda acc cudakernel.o acc_main.o 最適化オプションなどを加えた例 pgf90 Mcuda=cc20 O2 Minfo c cudakernel.cuf pgf90 acc O2 ta=tesla,cc60 Minfo c acc_main.f90 pgf90 Mcuda acc cudakernel.o acc_main.o 実行./a.out
16 16 CUDA C/Fortranで書かれたプログラムに対してOpenACC コードを追加したいこともあるかもしれない CUDA C/Fortranプログラムによって用意された配列を OpenACCカーネルから利用する必要がある deviceptr 節を使用する OpenACC 側では配列の確保や転送を書く必要がない
17 17 cuda_main.cu extern "C" void acckernel(int N, float *A, float *B, float *C); global void gpukernel(int N, float *C, float *A, float *B) { 通常の CUDA カーネル記述 ( 省略 ) main 関数内 ( 通常の CUDA C 記述 メモリ解放は省略 ) A = (float*)malloc(sizeof(float)*n); B = (float*)malloc(sizeof(float)*n); C = (float*)malloc(sizeof(float)*n); cudamalloc((void**)&da, sizeof(float)*n); cudamalloc((void**)&db, sizeof(float)*n); cudamalloc((void**)&dc, sizeof(float)*n); cudamemcpy(da, A, sizeof(float)*n, cudamemcpyhosttodevice); cudamemcpy(db, B, sizeof(float)*n, cudamemcpyhosttodevice); cudamemcpy(dc, C, sizeof(float)*n, cudamemcpyhosttodevice); gpukernel<<<grids,blocks>>>(n, dc, da, db); acckernel(n, dc, da, db); cudamemcpy(c, dc, sizeof(float)*n, cudamemcpydevicetohost); acckernel.c void acckernel (int N, float *C, float *A, float *B) { #pragma acc kernels deviceptr(a,b,c) #pragma acc loop independent for(int i=0; i<n; i++){ C[i] += A[i] * B[i]; cudamalloc で確保した配列を渡し deviceptr で受ける pgcc acc O2 Minfo ta=tesla,cc60 c acckernel.c nvcc O2 gencode arch=compute_60,code= "sm_60,compute_60 " c cuda_main.cu pgcc Mcuda=cc20 acc o hybrid2 acckernel.o cuda_main.o
18 18 cuda_main.cuf module cudakernel contains attributes(global) subroutine cudakernel(n, C, A, B) integer,value :: ID, N real(4), device :: A(:), B(:), C(:) ID = (blockidx%x 1)*blockDim%x + threadidx%x GPU カーネルの記述は省略 end subroutine cudakernel end module cudakernel program main use cudafor use cudakernel use acckernel implicit none real(4), allocatable, dimension(:) :: A, B, C real(4), allocatable,device :: da(:), db(:), dc(:) allocate と初期化は省略 解放も省略 da = A; db = B; dc = C dimgrid = dim3(2,1,1) dimblock = dim3(64,1,1) call cudakernel<<<dimgrid, dimblock>>>(n, dc, da, db) call acckernel(n, dc, da, db) C = dc acckernel.f90 module acckernel contains subroutine acckernel(n, C, A, B) integer :: I, N real(4), device :: A(:), B(:), C(:)!$acc kernels deviceptr(a,b,c)!$acc loop do I=1, N C(I) = C(I) + A(I) * B(I) enddo!$acc end kernels end subroutine acckernel end module acckernel デバイス用に確保した配列を渡し deviceptr で受ける,device の為に acckernel.f90 にも -Mcuda オプションが必要 pgf90 Mcuda acc ta=tesla,cc60 O2 Minfo c acckernel.f90 pgf90 Mcuda=cc60 O2 Minfo c cuda_main.cuf pgf90 Mcuda=cc60 acc o hybrid2 cuda_main.o acckernel.o
19 19 CUDA 用に用意されているライブラリをOpenACCから利用したい グローバルメモリにデータを配置した状態から関数を呼び出すだけのものであればhost_data / use_deviceを利用することで実現が可能 ライブラリの提供する専用関数で値を設定するようなものは困難
20 20 メモリ解放などの処理は省略 cudamalloc((void**)&da, sizeof(float)*n*n); cudamalloc((void**)&db, sizeof(float)*n*n); cudamalloc((void**)&dc, sizeof(float)*n*n); cudamemcpy(da, A, sizeof(float)*n*n, cudamemcpyhosttodevice); cudamemcpy(db, B, sizeof(float)*n*n, cudamemcpyhosttodevice); cudamemcpy(dc, C, sizeof(float)*n*n, cudamemcpyhosttodevice); cublascreate(&handle); cublassgemm(handle, CUBLAS_OP_N, CUBLAS_OP_N, N, N, N, &alpha, da, N, db, N, &beta, dc, N); cudamemcpy(c, dc, sizeof(float)*n*n, cudamemcpydevicetohost); 上 :CUDA C + CUBLAS cudamallocとcudamemcpyでデータを準備し GPU 側の配列を引数に与えてcublas 関数を実行コンパイル例 :nvcc -O3 -lcublas cublas.c 下 :OpenACC + CUBLAS data 指示文でデータ転送 host_data/use_deviceで指示をしてからcublas 関数を実行コンパイル例 :pgcc -Mcuda -acc -O3 -ta=tesla,cc60 -lcublas hybrid.c cublascreate(&handle); #pragma acc enter data copyin(a[0:n*n], B[0:N*N], C[0:N*N]) #pragma acc host_data use_device(a, B, C) { cublassgemm(handle, CUBLAS_OP_N, CUBLAS_OP_N, N, N, N, &alpha, A, N, B, N, &beta, C, N); #pragma acc exit data copyout(c[0:n*n])
21 21 メモリ解放などの処理は省略 use cublas real(4), allocatable, dimension(:,:) :: A, B, C real(4), allocatable, dimension(:,:),device :: da, db, dc allocate(a(n,n), B(N,N), C(N,N)) allocate(da(n,n), db(n,n), dc(n,n)) da = A; db = B; dc = C call cublassgemm('n','n',n,n,n,alpha,da,n,db,n,beta,dc,n) C = dc 上 :CUDA Fortran + CUBLAS CUDA Fortran の書き方で GPU 上のメモリを準備し GPU 側の配列を引数に与えて cublas 関数 を実行コンパイル例 :pgf90 -O3 cublas.cuf 下 :OpenACC + CUBLAS data 指示文でデータ転送 host_data/use_device で指示をしてから cublas 関数を実行コンパイル例 :pgf90 -Mcuda -acc -O3 -ta=tesla,cc60 hybrid.f90 use cublas real(4), allocatable, dimension(:,:) :: A, B, C allocate(a(n,n), B(N,N), C(N,N))!$acc enter data copyin(a(1:n,1:n), B(1:N,1:N), C(1:N,1:N))!$acc host_data use_device(a, B, C) call cublassgemm('n','n',n,n,n,alpha,a,n,b,n,beta,c,n)!$acc end host_data!$acc exit data copyout(c(1:n,1:n)) どちらの実装も C 版と異なり -lcublas 指定がないが use cublas が入っているためライブラリがリンクされる
22 22 OpenACC による単純な行列積実装と CUBLAS による高速な行列積実装の性能を比較した 正方行列同士の単純な行列積計算 ACC:OpenACCによる単純な実装 ( 外部 2 重ループの並列化 ) CUBLAS:cublassgemmを利用 hybrid:openaccからcublassgemmを呼び出し CPU : MKL sgemm CPU : Xeon E v2 icc , mkl=parallel GPU : Tesla K40c pgcc 16.9, -O3 -ta=tesla,cc35 実行時間 ( ミリ秒 ) CUBLAS の直接利用と OpenACC からの利用に有意な性能差は無し C でも Fortran でも有意な性能差は無し 一辺のサイズ ACC CUBLAS hybrid CPU
23 23 OpenACCとCUDAの連携 OpenACCと (CUDA 向け ) ライブラリの連携について紹介した 連携させる方法自体はあまり難しくはないため 使い勝手と性能を考えて適切な実装方法を選ぶのが良い 対象とする問題にあった高性能な実装やライブラリが存在する場合には積極的に活用するべき
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 コンピューティング環境
概要 目的 CUDA Fortran の利用に関する基本的なノウハウを提供する 本チュートリアル受講後は Web 上で公開されている資料等を参照しながら独力で CUDA Fortran が利用できることが目標 対象 CUDA Fortran の利用に興味を抱いている方 前提とする知識 Fortran
CUDA Fortran チュートリアル 2010 年 9 月 29 日 NEC 概要 目的 CUDA Fortran の利用に関する基本的なノウハウを提供する 本チュートリアル受講後は Web 上で公開されている資料等を参照しながら独力で CUDA Fortran が利用できることが目標 対象 CUDA Fortran の利用に興味を抱いている方 前提とする知識 Fortran を用いた Linux
Slide 1
CUDA プログラミングの基本 パート II - カーネル CUDA の基本の概要 パート I CUDAのソフトウェアスタックとコンパイル GPUのメモリ管理 パート II カーネルの起動 GPUコードの具体像 注 : 取り上げているのは基本事項のみです そのほか多数の API 関数についてはプログラミングガイドを ご覧ください GPU 上でのコードの実行 カーネルは C 関数 + 多少の制約 ホストメモリはアクセスできない戻り値型は
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
概要 OpenACC とは OpenACC について OpenMP, CUDA との違い OpenACC の指示文 並列化領域指定指示文 (kernels/parallel) データ移動指示文 ループ指示文 OpenACC の実用例 実習 コンパイラメッセージの見方 OpenACC プログラムの実装
第 74 回お試しアカウント付き 並列プログラミング講習会 GPU プログラミング入門 in 名古屋 星野哲也 ( 助教 ) [email protected] 大島聡史 ( 助教 ) [email protected] 2016 年 3 月 14 日 ( 火 ) 東京大学情報基盤センター 概要 OpenACC とは OpenACC について OpenMP, CUDA との違い
( 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
CUDA を用いた画像処理 画像処理を CUDA で並列化 基本的な並列化の考え方 目標 : 妥当な Naïve コードが書ける 最適化の初歩がわかる ブロックサイズ メモリアクセスパターン
CUDA 画像処理入門 エヌビディアジャパン CUDA エンジニア森野慎也 GTC Japan 2014 CUDA を用いた画像処理 画像処理を CUDA で並列化 基本的な並列化の考え方 目標 : 妥当な Naïve コードが書ける 最適化の初歩がわかる ブロックサイズ メモリアクセスパターン RGB Y( 輝度 ) 変換 カラー画像から グレイスケールへの変換 Y = 0.299 R + 0.587
2 09:00-09:30 受付 09:30-12:00 GPU 入門,CUDA 入門 13:00-14:30 OpenACC 入門 + HA-PACS ログイン 14:45-16:15 OpenACC 最適化入門と演習 16:30-18:00 CUDA 最適化入門と演習
担当 大島聡史 ( 助教 ) [email protected] 星野哲也 ( 助教 ) [email protected] 質問やサンプルプログラムの提供についてはメールでお問い合わせください 1 2016 年 6 月 8 日 ( 水 ) 東京大学情報基盤センター 2 09:00-09:30 受付 09:30-12:00 GPU 入門,CUDA 入門 13:00-14:30
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.
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...........................................
インテル(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...
OpenACC
109 OpenMP/OpenACC, hoshino @ cc.u-tokyo.ac.jp nakajima @ cc.u-tokyo.ac.jp 1 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 $
熊本大学学術リポジトリ 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 による高速演算について 榎本昌一 東京大学大学院工学系研究科システム創成学専攻
演習1: 演習準備
演習 1: 演習準備 2013 年 8 月 6 日神戸大学大学院システム情報学研究科森下浩二 1 演習 1 の内容 神戸大 X10(π-omputer) について システム概要 ログイン方法 コンパイルとジョブ実行方法 OpenMP の演習 ( 入門編 ) 1. parallel 構文 実行時ライブラリ関数 2. ループ構文 3. shared 節 private 節 4. reduction 節
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
OpenACCによる並列化
実習 OpenACC による ICCG ソルバーの並列化 1 ログイン Reedbush へのログイン $ ssh reedbush.cc.u-tokyo.ac.jp l txxxxx Module のロード $ module load pgi/17.3 cuda ログインするたびに必要です! ワークディレクトリに移動 $ cdw ターゲットプログラム /srcx OpenACC 用のディレクトリの作成
Fortran 勉強会 第 5 回 辻野智紀
Fortran 勉強会 第 5 回 辻野智紀 今回のお品書き サブルーチンの分割コンパイル ライブラリ 静的ライブラリ 動的ライブラリ モジュール その前に 以下の URL から STPK ライブラリをインストールしておいて下さい. http://www.gfd-dennou.org/library/davis/stpk 前回参加された方はインストール済みのはず. サブルーチンの分割コンパイル サブルーチンの独立化
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
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
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
memo
数理情報工学演習第一 C プログラミング演習 ( 第 5 回 ) 2015/05/11 DEPARTMENT OF MATHEMATICAL INFORMATICS 1 今日の内容 : プロトタイプ宣言 ヘッダーファイル, プログラムの分割 課題 : 疎行列 2 プロトタイプ宣言 3 C 言語では, 関数や変数は使用する前 ( ソースの上のほう ) に定義されている必要がある. double sub(int
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
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];
プログラミング実習I
プログラミング実習 I 05 関数 (1) 人間システム工学科井村誠孝 [email protected] 関数とは p.162 数学的には入力に対して出力が決まるもの C 言語では入出力が定まったひとまとまりの処理 入力や出力はあるときもないときもある main() も関数の一種 何かの仕事をこなしてくれる魔法のブラックボックス 例 : printf() 関数中で行われている処理の詳細を使う側は知らないが,
Microsoft PowerPoint - 09.pptx
情報処理 Ⅱ 第 9 回 2014 年 12 月 22 日 ( 月 ) 関数とは なぜ関数 関数の分類 自作関数 : 自分で定義する. ユーザ関数 ユーザ定義関数 などともいう. 本日のテーマ ライブラリ関数 : 出来合いのもの.printf など. なぜ関数を定義するのか? 処理を共通化 ( 一般化 ) する プログラムの見通しをよくする 機能分割 ( モジュール化, 再利用 ) 責任 ( あるいは不具合の発生源
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
<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
ストリームを用いたコンカレントカーネルプログラミングと最適化 エヌビディアジャパン CUDAエンジニア森野慎也 GTC Japan 2014
ストリームを用いたコンカレントカーネルプログラミングと最適化 エヌビディアジャパン CUDAエンジニア森野慎也 GTC Japan 2014 コンカレントな処理の実行 システム内部の複数の処理を 平行に実行する CPU GPU メモリ転送 カーネル実行 複数のカーネル間 ストリーム GPU 上の処理キュー カーネル実行 メモリ転送の並列性 実行順序 DEFAULT STREAM Stream : GPU
Microsoft PowerPoint - GPGPU実践基礎工学(web).pptx
GPU のプログラム構造 長岡技術科学大学電気電子情報工学専攻出川智啓 今回の内容 GPU プログラミング環境 (CUDA) GPU プログラムの実行の流れ CUDA によるプログラムの記述 カーネル (GPU で処理する関数 ) の構造 記述方法とその理由 GPU 固有のパラメータの確認 405 GPU(Graphics Processing Unit) とは 画像処理専用のハードウェア 具体的には画像処理用のチップ
数はファイル内のどの関数からでも参照できるので便利ではありますが 変数の衝突が起こったり ファイル内のどこで値が書き換えられたかわかりづらくなったりなどの欠点があります 複数の関数で変数を共有する時は出来るだけ引数を使うようにし グローバル変数は プログラムの全体の状態を表すものなど最低限のものに留
第 10 章分割コンパイル 1 ソースを分割する今まで出てきたソースは全て一つのソースファイルにソースを記述してきました しかし ソースが長くなっていくと全てを一つのファイルに書くと読みづらくなります そこで ソースを複数のファイルに分割してコンパイルを行う分割コンパイルをします 今章は章名にもなっている 分割コンパイルの方法についてやります 分割コンパイルする時は大抵 関連性のある機能ごとにファイルにまとめます
演習2
神戸市立工業高等専門学校電気工学科 / 電子工学科専門科目 数値解析 2017.6.2 演習 2 山浦剛 ([email protected]) 講義資料ページ h t t p://clim ate.aic s. riken. jp/m embers/yamaura/num erical_analysis. html 曲線の推定 N 次多項式ラグランジュ補間 y = p N x = σ N x x
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 のみの場合と比べて高速化されることを体験 問題 ( インプリメントする内容
コンピュータ工学講義プリント (7 月 17 日 ) 今回の講義では フローチャートについて学ぶ フローチャートとはフローチャートは コンピュータプログラムの処理の流れを視覚的に表し 処理の全体像を把握しやすくするために書く図である 日本語では流れ図という 図 1 は ユーザーに 0 以上の整数 n
コンピュータ工学講義プリント (7 月 17 日 ) 今回の講義では フローチャートについて学ぶ フローチャートとはフローチャートは コンピュータプログラムの処理の流れを視覚的に表し 処理の全体像を把握しやすくするために書く図である 日本語では流れ図という 図 1 は ユーザーに 0 以上の整数 n を入力してもらい その後 1 から n までの全ての整数の合計 sum を計算し 最後にその sum
第9回 配列(array)型の変数
第 12 回 配列型の変数 情報処理演習 ( テキスト : 第 4 章, 第 8 章 ) 今日の内容 1. 配列の必要性 2. 配列の宣言 3. 配列変数のイメージ 4. 配列変数を使用した例 5. 範囲を超えた添字を使うと? 6. 多次元配列変数 7. 多次元配列変数を使用した例 8. データのソーティング 9. 今日の練習問題 多数のデータ処理 1. 配列の必要性 ( テキスト 31 ページ )
コマンドラインから受け取った文字列の大文字と小文字を変換するプログラムを作成せよ 入力は 1 バイトの表示文字とし アルファベット文字以外は変換しない 1. #include <stdio.h> 2. #include <ctype.h> /*troupper,islower,isupper,tol
コマンドラインから受け取った文字列の大文字と小文字を変換するプログラムを作成せよ 入力は 1 バイトの表示文字とし アルファベット文字以外は変換しない 1. #include 2. #include /*troupper,islower,isupper,tolowerを使うため宣言*/ 3. 4. int get_n(char *); 5. void replace(char
Microsoft PowerPoint - 演習2:MPI初歩.pptx
演習 2:MPI 初歩 - 並列に計算する - 2013 年 8 月 6 日 神戸大学大学院システム情報学研究科計算科学専攻横川三津夫 MPI( メッセージ パッシング インターフェース ) を使おう! [ 演習 2 の内容 ] はじめの一歩課題 1: Hello, world を並列に出力する. 課題 2: プロセス 0 からのメッセージを受け取る (1 対 1 通信 ). 部分に分けて計算しよう課題
フローチャートの書き方
アルゴリズム ( 算法 ) 入門 1 プログラムの作成 機械工学専攻泉聡志 http://masudahp.web.fc2.com/flowchart/index.html 参照 1 何をどのように処理させたいのか どのようなデータを入力し どのような結果を出力させるのか問題を明確にする 2 問題の内容どおりに処理させるための手順を考える ( フローチャートの作成 )~アルゴリズム( 算法 ) の作成
Microsoft PowerPoint - GPGPU実践基礎工学(web).pptx
GPU のメモリ階層 長岡技術科学大学電気電子情報工学専攻出川智啓 今回の内容 GPU のメモリ階層 グローバルメモリ 共有メモリ モザイク処理への適用 コンスタントメモリ 空間フィルタへの適用 577 GPU の主要部品 基盤 GPU( チップ )+ 冷却部品 画面出力端子 電源入力端子 メモリ 特性の把握が重要 電源入力端子 画面出力端子 メモリ チップ PCI Ex 端子 http://www.geforce.com/whats
PowerPoint プレゼンテーション
講座準備 講座資料は次の URL から DL 可能 https://goo.gl/jnrfth 1 ポインタ講座 2017/01/06,09 fumi 2 はじめに ポインタはC 言語において理解が難しいとされる そのポインタを理解することを目的とする 講座は1 日で行うので 詳しいことは調べること 3 はじめに みなさん復習はしましたか? 4 & 演算子 & 演算子を使うと 変数のアドレスが得られる
Microsoft Word - VBA基礎(6).docx
あるクラスの算数の平均点と理科の平均点を読み込み 総点を計算するプログラムを考えてみましょう 一クラスだけ読み込む場合は test50 のようなプログラムになります プログラムの流れとしては非常に簡単です Sub test50() a = InputBox(" バナナ組の算数の平均点を入力してください ") b = InputBox(" バナナ組の理科の平均点を入力してください ") MsgBox
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
第1回 プログラミング演習3 センサーアプリケーション
C プログラミング - ポインタなんて恐くない! - 藤田悟 [email protected] 目標 C 言語プログラムとメモリ ポインタの関係を深く理解する C 言語プログラムは メモリを素のまま利用できます これが原因のエラーが多く発生します メモリマップをよく頭にいれて ポインタの動きを理解できれば C 言語もこわくありません 1. ポインタ入門編 ディレクトリの作成と移動 mkdir
cp-7. 配列
cp-7. 配列 (C プログラムの書き方を, パソコン演習で学ぶシリーズ ) https://www.kkaneko.jp/cc/adp/index.html 金子邦彦 1 本日の内容 例題 1. 月の日数配列とは. 配列の宣言. 配列の添え字. 例題 2. ベクトルの内積例題 3. 合計点と平均点例題 4. 棒グラフを描く配列と繰り返し計算の関係例題 5. 行列の和 2 次元配列 2 今日の到達目標
分割コンパイル (2018 年度 ) 担当 : 笹倉 佐藤 分割コンパイルとは 一つのプログラムのソースを複数のソースファイルに分けてコンパイルすること ある程度大きなプログラムの場合ソースファイルをいくつかに分割して開発するのが普通 1
分割コンパイル (2018 年度 ) 担当 : 笹倉 佐藤 2018.12.20 分割コンパイルとは 一つのプログラムのソースを複数のソースファイルに分けてコンパイルすること ある程度大きなプログラムの場合ソースファイルをいくつかに分割して開発するのが普通 1 なぜ分割コンパイルするのか 1. コンパイル時間を短縮するため 2. ソースコードを見やすくするため 3. ソースコードを再利用しやすくするため
Microsoft PowerPoint ppt
基礎演習 3 C 言語の基礎 (5) 第 05 回 (20 年 07 月 07 日 ) メモリとポインタの概念 ビットとバイト 計算機内部では データは2 進数で保存している 計算機は メモリにデータを蓄えている bit 1bit 0 もしくは 1 のどちらかを保存 byte 1byte 1bitが8つ集まっている byte が メモリの基本単位として使用される メモリとアドレス メモリは 1byte
Microsoft PowerPoint - C言語の復習(配布用).ppt [互換モード]
if 文 (a と b の大きい方を表示 ) C 言語 Ⅰ の復習 条件判定 (if, 条件式 ) ループ (for[ 二重まで ], while, do) 配列 ( 次元 次元 ) トレース int a, b; printf( 整数 a: ); scanf( %d, &a); printf( 整数 b: ); scanf( %d, &b); //つのif 文で表現する場合間違えやすい どっちに =
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)
コードのチューニング
OpenMP による並列化実装 八木学 ( 理化学研究所計算科学研究センター ) KOBE HPC Spring School 2019 2019 年 3 月 14 日 スレッド並列とプロセス並列 スレッド並列 OpenMP 自動並列化 プロセス並列 MPI プロセス プロセス プロセス スレッドスレッドスレッドスレッド メモリ メモリ プロセス間通信 Private Private Private
情報処理概論(第二日目)
情報処理概論 工学部物質科学工学科応用化学コース機能物質化学クラス 第 8 回 2005 年 6 月 9 日 前回の演習の解答例 多項式の計算 ( 前半 ): program poly implicit none integer, parameter :: number = 5 real(8), dimension(0:number) :: a real(8) :: x, total integer
(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド
メソッド ( 教科書第 7 章 p.221~p.239) ここまでには文字列を表示する System.out.print() やキーボードから整数を入力する stdin.nextint() などを用いてプログラムを作成してきた これらはメソッドと呼ばれるプログラムを構成する部品である メソッドとは Java や C++ などのオブジェクト指向プログラミング言語で利用されている概念であり 他の言語での関数やサブルーチンに相当するが
Microsoft PowerPoint - lec10.ppt
今日の内容, とポインタの組み合わせ, 例題 1. 住所録例題 2. と関数とは. を扱う関数. 例題 3. のリスト とポインタの組み合わせ 今日の到達目標 自分で を定義する 自分で定義したについて, 配列やポインタを作成する データ型 基本データ型 char 文字 (1 文字 ) int 整数 double 浮動小数など その他のデータ型配列 データの並び ( 文字列も, 文字の並び ) ポインタ
PowerPoint プレゼンテーション
2018/10/05 竹島研究室創成課題 第 2 回 C 言語演習 変数と演算 東京工科大学 加納徹 前回の復習 Hello, world! と表示するプログラム 1 #include 2 3 int main(void) { 4 printf("hello, world! n"); 5 return 0; 6 } 2 プログラム実行の流れ 1. 作業ディレクトリへの移動 $ cd
C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ
C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ 今回のプログラミングの課題 次のステップによって 徐々に難易度の高いプログラムを作成する ( 参照用の番号は よくわかる C 言語 のページ番号 ) 1. キーボード入力された整数 10 個の中から最大のものを答える 2. 整数を要素とする配列 (p.57-59) に初期値を与えておき
nakao
Fortran+Python 4 Fortran, 2018 12 12 !2 Python!3 Python 2018 IEEE spectrum https://spectrum.ieee.org/static/interactive-the-top-programming-languages-2018!4 Python print("hello World!") if x == 10: print
Microsoft PowerPoint - 講義:片方向通信.pptx
MPI( 片方向通信 ) 09 年 3 月 5 日 神戸大学大学院システム情報学研究科計算科学専攻横川三津夫 09/3/5 KOBE HPC Spring School 09 分散メモリ型並列計算機 複数のプロセッサがネットワークで接続されており, れぞれのプロセッサ (PE) が, メモリを持っている. 各 PE が自分のメモリ領域のみアクセス可能 特徴数千から数万 PE 規模の並列システムが可能
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
