SlideShare a Scribd company logo
1 of 22
Download to read offline
エヌビディア合同会社 CUDA エンジニア 村上 真奈
OpenACC プログラミング入門
GPU コンピューティングとは?
アプリケーションコード
+
GPU CPU
5% of Code
計算負荷が高い関数
その他の逐次処理
CPUで実行
GPU アクセラレーションの実現方法
アプリケーション
GPU
ライブラリ
ライブラリを呼び出すだけ
簡単に高速化を実現
CUDA
重要なコードをCUDAで記述
最も自由度が高い
既存コードにディレクティブ
を挿入して高速化
OpenACC
ディレクティブ
OpenACC
シンプル | 強力 | 柔軟
イリノイ大学
MRI画像再構成
70倍 高速化
理研
NICAM- 大気現象シミュレーション
5% のコード変更で
7~8倍 高速化
main()
{
<serial code>
#pragma acc kernels
//自動的にGPUで実行
{
<parallel code>
}
}
OpenACC利用者
8000人+
OpenACC ディレクティブ
Program myscience
... serial code ...
!$acc kernels
do k = 1,n1
do i = 1,n2
... parallel code ...
enddo
enddo
!$acc end kernels
...
End Program myscience
CPU GPU
Fortran または C言語の
オリジナルコード
コンパイラへシンプルなヒント
コンパイラがコードを並列化
並列部はGPUで
逐次処理はCPUで動作
コンパイラへの
OpenACC
ヒント
OpenMP と OpenACC の比較
main() {
double pi = 0.0; long i;
#pragma omp parallel for reduction(+:pi)
for (i=0; i<N; i++)
{
double t = (double)((i+0.05)/N);
pi += 4.0/(1.0+t*t);
}
printf(“pi = %f¥n”, pi/N);
}
CPU
OpenMP
main() {
double pi = 0.0; long i;
#pragma acc kernels
for (i=0; i<N; i++)
{
double t = (double)((i+0.05)/N);
pi += 4.0/(1.0+t*t);
}
printf(“pi = %f¥n”, pi/N);
}
CPU GPU
OpenACC
CPUコアに
計算処理を分散
GPUコアに
計算処理を分散
new OpenACC ツールキット(2015/07~)
大学関係者の方は無償で使用可能
• Linux x64/ノードロック・ライセンス
• 大学関係者以外でも90日間無料トライアル可能
下記のサイトからOpenACC ツールキットをダウンロード
https://developer.nvidia.com/openacc
OpenACCを始める為のコンパイラ・解析
ツールなど一式が簡単にインストール
OpenACC ツールキット
PGIコンパイラ
Free OpenACC compiler for academia
NVProfプロファイラ
Easily find where to add compiler directives
サンプルコード
Learn from examples of real-world algorithms
ドキュメント
Quick start guide, Best practices, Forums
http://developer.nvidia.com/openacc
GPUウィザード
Identify which GPU libraries can jumpstart code
OpenACC を始めましょう
OpenACC ディレクティブ構文
C/C++
#pragma acc 指示行 [節[,]節] …]
{ structured block }
Fortran
!$acc 指示行 [節[,]節] …]
{ structured block }
!$acc end directive
例: SAXPY (Y=A*X+Y)
void saxpy(int n,
float a,
float *x,
float *restrict y)
{
#pragma acc parallel
for (int i = 0; i < n; ++i)
y[i] += a*x[i];
}
...
saxpy(N, 3.0, x, y);
...
 omp  acc  データの移動
OpenMP OpenACC
void saxpy(int n,
float a,
float *x,
float *restrict y)
{
#pragma omp parallel for
for (int i = 0; i < n; ++i)
y[i] += a*x[i];
}
...
saxpy(N, 3.0, x, y);
...
OpenACC 構文: parallel 指示行
• parallel : 並列に実行される領域を指示行で指定
#pragma acc parallel
for(int i=0;i<n;i++){
a[i] = 0.0;
b[i] = 1.0;
c[i] = 2.0;
}
kernel 1 Kernel(カーネル):
GPU上で実行される
関数
OpenACC 構文: kernels 指示行
• kernels : 複数のカーネルを作成
#pragma acc kernels
for(int i=0;i<n;i++){
a[i] = 0.0;
b[i] = 1.0;
c[i] = 2.0;
}
#pragma acc kernels
for(int i=0;i<n;i++){
a[i] = b[i] + c[i];
}
kernel 1
kernel 2
Kernel(カーネル):
GPU上で実行される
関数
簡単にコンパイル
OpenMP / OpenACC
void saxpy(int n, float a,
float *x,
float *restrict y)
{
#pragma acc parallel copy(y[:n]) copyin(x[:n])
#pragma omp parallel for
for (int i = 0; i < n; ++i)
y[i] += a*x[i];
}
...
saxpy(N, 3.0, x, y);
...
$ pgcc –acc –ta=nvidia –Minfo=accel saxpy.c
saxpy:
16, Generating present_or_copy(y[:n])
Generating present_or_copyin(x[:n])
Generating Tesla code
19, Loop is parallelizable
Accelerator kernel generated
19, #pragma acc loop gang, vector(128) /* blockIdx.x threadIdx.x */
例:ヤコビ反復法(アルゴリズム)
while ( error > tol ) {
error = 0.0;
for (int j = 1; j < N-1; j++) {
for (int i = 1; i < M-1; i++) {
Anew[j][i] = (A[j][i+1] + A[j][i-1] +
A[j-1][i] + A[j+1][i]) * 0.25;
error = max(error, abs(Anew[j][i] - A[j][i]));
}
}
for (int j = 1; j < N-1; j++) {
for (int i = 1; i < M-1; i++) {
A[j][i] = Anew[j][i];
}
}
}
A(i,j) A(i+1,j)A(i-1,j)
A(i,j-1)
A(i,j+1)
並列領域 (OpenACC)
 Parallels と Kernels
— 並列領域を指示
 Parallels
— 並列実行スタート
 Kernels
— 複数のカーネル
while ( error > tol ) {
error = 0.0;
#pragma acc kernels
for (int j = 1; j < N-1; j++) {
for (int i = 1; i < M-1; i++) {
Anew[j][i] = (A[j][i+1] + A[j][i-1] +
A[j-1][i] + A[j+1][i]) * 0.25;
error = max(error, abs(Anew[j][i] - A[j][i]);
}
}
#pragma acc kernels
for (int j = 1; j < N-1; j++) {
for (int i = 1; i < M-1; i++) {
A[j][i] = Anew[j][i];
}
}
}
簡単に解析(nvprof)
OpenMP / OpenACC
void saxpy(int n, float a,
float *x,
float *restrict y)
{
#pragma acc kernels copy(y[:n]) copyin(x[:n])
#pragma omp parallel for
for (int i = 0; i < n; ++i)
y[i] += a*x[i];
}
...
saxpy(N, 3.0, x, y);
...
$ pgcc -Minfo -acc saxpy.c
saxpy:
16, Generating present_or_copy(y[:n])
Generating present_or_copyin(x[:n])
Generating Tesla code
19, Loop is parallelizable
Accelerator kernel generated
19, #pragma acc loop gang, vector(128) /* blockIdx.x threadIdx.x */
$ nvprof ./a.out
==10302== NVPROF is profiling process 10302, command: ./a.out
==10302== Profiling application: ./a.out
==10302== Profiling result:
Time(%) Time Calls Avg Min Max Name
62.95% 3.0358ms 2 1.5179ms 1.5172ms 1.5186ms [CUDA memcpy HtoD]
31.48% 1.5181ms 1 1.5181ms 1.5181ms 1.5181ms [CUDA memcpy DtoH]
5.56% 268.31us 1 268.31us 268.31us 268.31us saxpy_19_gpu
ボトルネックの可視化(nvvp)
1 サイクル
GPU
カーネル
GPU
カーネル
過剰なメモリ転送
while ( error > tol ) {
error = 0.0;
#pragma acc kernels
for (int j = 1; j < N-1; j++) {
for (int i = 1; i < M-1; i++) {
Anew[j][i] = (A[j][i+1] + A[j][i-1] +
A[j-1][i] + A[j+1][i]) * 0.25;
error = max(error, abs(Anew[j][i] - A[j][i]);
}
}
#pragma acc kernels
for (int j = 1; j < N-1; j++) {
for (int i = 1; i < M-1; i++) {
A[j][i] = Anew[j][i];
}
}
}
配列Aへメモリ転送
(CPU->GPU)
配列Anewへメモリ転送
(CPU->GPU)
配列Anewへメモリ転送
(GPU->CPU)
配列Aへメモリ転送
(GPU->CPU)
メモリ転送のタイミングを制御
データ制御ディレクティブ
copyin (CPUGPU)
copyout (CPUGPU)
copy
create
present
pcopyin
pcopyout
pcopy
pcreate
#pragma acc data pcopy(A, Anew)
while ( error > tol ) {
error = 0.0;
#pragma acc kernels pcopy(Anew[:][:]) pcopyin(A[:][:])
for (int j = 1; j < N-1; j++) {
for (int i = 1; i < M-1; i++) {
Anew[j][i] = (A[j][i+1] + A[j][i-1] +
A[j-1][i] + A[j+1][i]) * 0.25;
error = max(error, abs(Anew[j][i] - A[j][i]);
}
}
#pragma acc kernels pcopy(A[:][:]) pcopyin(Anew[:][:])
for (int j = 1; j < N-1; j++) {
for (int i = 1; i < M-1; i++) {
A[j][i] = Anew[j][i];
}
}
}
性能比較
Time(sec) Speedup
CPU1 OpenMP thread 26.186 --
OpenACC(最適化前) 13.638 1.92x
OpenACC(最適化後) 0.773 33.88x
Ubuntu 14.04LTS 64bit
CPU:Intel Xeon CPU E5-1603 v3@2.8GHz x 4
GPU:Tesla K40c
Thank you

More Related Content

More from NVIDIA Japan

More from NVIDIA Japan (20)

HPC+AI ってよく聞くけど結局なんなの
HPC+AI ってよく聞くけど結局なんなのHPC+AI ってよく聞くけど結局なんなの
HPC+AI ってよく聞くけど結局なんなの
 
Magnum IO GPUDirect Storage 最新情報
Magnum IO GPUDirect Storage 最新情報Magnum IO GPUDirect Storage 最新情報
Magnum IO GPUDirect Storage 最新情報
 
データ爆発時代のネットワークインフラ
データ爆発時代のネットワークインフラデータ爆発時代のネットワークインフラ
データ爆発時代のネットワークインフラ
 
Hopper アーキテクチャで、変わること、変わらないこと
Hopper アーキテクチャで、変わること、変わらないことHopper アーキテクチャで、変わること、変わらないこと
Hopper アーキテクチャで、変わること、変わらないこと
 
GPU と PYTHON と、それから最近の NVIDIA
GPU と PYTHON と、それから最近の NVIDIAGPU と PYTHON と、それから最近の NVIDIA
GPU と PYTHON と、それから最近の NVIDIA
 
GTC November 2021 – テレコム関連アップデート サマリー
GTC November 2021 – テレコム関連アップデート サマリーGTC November 2021 – テレコム関連アップデート サマリー
GTC November 2021 – テレコム関連アップデート サマリー
 
テレコムのビッグデータ解析 & AI サイバーセキュリティ
テレコムのビッグデータ解析 & AI サイバーセキュリティテレコムのビッグデータ解析 & AI サイバーセキュリティ
テレコムのビッグデータ解析 & AI サイバーセキュリティ
 
必見!絶対におすすめの通信業界セッション 5 つ ~秋の GTC 2020~
必見!絶対におすすめの通信業界セッション 5 つ ~秋の GTC 2020~必見!絶対におすすめの通信業界セッション 5 つ ~秋の GTC 2020~
必見!絶対におすすめの通信業界セッション 5 つ ~秋の GTC 2020~
 
2020年10月29日 プロフェッショナルAI×Roboticsエンジニアへのロードマップ
2020年10月29日 プロフェッショナルAI×Roboticsエンジニアへのロードマップ2020年10月29日 プロフェッショナルAI×Roboticsエンジニアへのロードマップ
2020年10月29日 プロフェッショナルAI×Roboticsエンジニアへのロードマップ
 
2020年10月29日 Jetson活用によるAI教育
2020年10月29日 Jetson活用によるAI教育2020年10月29日 Jetson活用によるAI教育
2020年10月29日 Jetson活用によるAI教育
 
2020年10月29日 Jetson Nano 2GBで始めるAI x Robotics教育
2020年10月29日 Jetson Nano 2GBで始めるAI x Robotics教育2020年10月29日 Jetson Nano 2GBで始めるAI x Robotics教育
2020年10月29日 Jetson Nano 2GBで始めるAI x Robotics教育
 
COVID-19 研究・対策に活用可能な NVIDIA ソフトウェアと関連情報
COVID-19 研究・対策に活用可能な NVIDIA ソフトウェアと関連情報COVID-19 研究・対策に活用可能な NVIDIA ソフトウェアと関連情報
COVID-19 研究・対策に活用可能な NVIDIA ソフトウェアと関連情報
 
Jetson Xavier NX クラウドネイティブをエッジに
Jetson Xavier NX クラウドネイティブをエッジにJetson Xavier NX クラウドネイティブをエッジに
Jetson Xavier NX クラウドネイティブをエッジに
 
GTC 2020 発表内容まとめ
GTC 2020 発表内容まとめGTC 2020 発表内容まとめ
GTC 2020 発表内容まとめ
 
NVIDIA Jetson導入事例ご紹介
NVIDIA Jetson導入事例ご紹介NVIDIA Jetson導入事例ご紹介
NVIDIA Jetson導入事例ご紹介
 
JETSON 最新情報 & 自動外観検査事例紹介
JETSON 最新情報 & 自動外観検査事例紹介JETSON 最新情報 & 自動外観検査事例紹介
JETSON 最新情報 & 自動外観検査事例紹介
 
HELLO AI WORLD - MEET JETSON NANO
HELLO AI WORLD - MEET JETSON NANOHELLO AI WORLD - MEET JETSON NANO
HELLO AI WORLD - MEET JETSON NANO
 
Final 20200326 jetson edge comuputing digital seminar 1 final (1)
Final 20200326 jetson edge comuputing digital seminar 1 final (1)Final 20200326 jetson edge comuputing digital seminar 1 final (1)
Final 20200326 jetson edge comuputing digital seminar 1 final (1)
 
20200326 jetson edge comuputing digital seminar 1 final
20200326 jetson edge comuputing digital seminar 1 final20200326 jetson edge comuputing digital seminar 1 final
20200326 jetson edge comuputing digital seminar 1 final
 
20200326 jetson edge comuputing digital seminar 1 final
20200326 jetson edge comuputing digital seminar 1 final20200326 jetson edge comuputing digital seminar 1 final
20200326 jetson edge comuputing digital seminar 1 final
 

Recently uploaded

Recently uploaded (7)

Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 

1074: OpenACC プログラミング入門

  • 1. エヌビディア合同会社 CUDA エンジニア 村上 真奈 OpenACC プログラミング入門
  • 2. GPU コンピューティングとは? アプリケーションコード + GPU CPU 5% of Code 計算負荷が高い関数 その他の逐次処理 CPUで実行
  • 4. OpenACC シンプル | 強力 | 柔軟 イリノイ大学 MRI画像再構成 70倍 高速化 理研 NICAM- 大気現象シミュレーション 5% のコード変更で 7~8倍 高速化 main() { <serial code> #pragma acc kernels //自動的にGPUで実行 { <parallel code> } } OpenACC利用者 8000人+
  • 5. OpenACC ディレクティブ Program myscience ... serial code ... !$acc kernels do k = 1,n1 do i = 1,n2 ... parallel code ... enddo enddo !$acc end kernels ... End Program myscience CPU GPU Fortran または C言語の オリジナルコード コンパイラへシンプルなヒント コンパイラがコードを並列化 並列部はGPUで 逐次処理はCPUで動作 コンパイラへの OpenACC ヒント
  • 6. OpenMP と OpenACC の比較 main() { double pi = 0.0; long i; #pragma omp parallel for reduction(+:pi) for (i=0; i<N; i++) { double t = (double)((i+0.05)/N); pi += 4.0/(1.0+t*t); } printf(“pi = %f¥n”, pi/N); } CPU OpenMP main() { double pi = 0.0; long i; #pragma acc kernels for (i=0; i<N; i++) { double t = (double)((i+0.05)/N); pi += 4.0/(1.0+t*t); } printf(“pi = %f¥n”, pi/N); } CPU GPU OpenACC CPUコアに 計算処理を分散 GPUコアに 計算処理を分散
  • 7. new OpenACC ツールキット(2015/07~) 大学関係者の方は無償で使用可能 • Linux x64/ノードロック・ライセンス • 大学関係者以外でも90日間無料トライアル可能 下記のサイトからOpenACC ツールキットをダウンロード https://developer.nvidia.com/openacc OpenACCを始める為のコンパイラ・解析 ツールなど一式が簡単にインストール
  • 8. OpenACC ツールキット PGIコンパイラ Free OpenACC compiler for academia NVProfプロファイラ Easily find where to add compiler directives サンプルコード Learn from examples of real-world algorithms ドキュメント Quick start guide, Best practices, Forums http://developer.nvidia.com/openacc GPUウィザード Identify which GPU libraries can jumpstart code
  • 10. OpenACC ディレクティブ構文 C/C++ #pragma acc 指示行 [節[,]節] …] { structured block } Fortran !$acc 指示行 [節[,]節] …] { structured block } !$acc end directive
  • 11. 例: SAXPY (Y=A*X+Y) void saxpy(int n, float a, float *x, float *restrict y) { #pragma acc parallel for (int i = 0; i < n; ++i) y[i] += a*x[i]; } ... saxpy(N, 3.0, x, y); ...  omp  acc  データの移動 OpenMP OpenACC void saxpy(int n, float a, float *x, float *restrict y) { #pragma omp parallel for for (int i = 0; i < n; ++i) y[i] += a*x[i]; } ... saxpy(N, 3.0, x, y); ...
  • 12. OpenACC 構文: parallel 指示行 • parallel : 並列に実行される領域を指示行で指定 #pragma acc parallel for(int i=0;i<n;i++){ a[i] = 0.0; b[i] = 1.0; c[i] = 2.0; } kernel 1 Kernel(カーネル): GPU上で実行される 関数
  • 13. OpenACC 構文: kernels 指示行 • kernels : 複数のカーネルを作成 #pragma acc kernels for(int i=0;i<n;i++){ a[i] = 0.0; b[i] = 1.0; c[i] = 2.0; } #pragma acc kernels for(int i=0;i<n;i++){ a[i] = b[i] + c[i]; } kernel 1 kernel 2 Kernel(カーネル): GPU上で実行される 関数
  • 14. 簡単にコンパイル OpenMP / OpenACC void saxpy(int n, float a, float *x, float *restrict y) { #pragma acc parallel copy(y[:n]) copyin(x[:n]) #pragma omp parallel for for (int i = 0; i < n; ++i) y[i] += a*x[i]; } ... saxpy(N, 3.0, x, y); ... $ pgcc –acc –ta=nvidia –Minfo=accel saxpy.c saxpy: 16, Generating present_or_copy(y[:n]) Generating present_or_copyin(x[:n]) Generating Tesla code 19, Loop is parallelizable Accelerator kernel generated 19, #pragma acc loop gang, vector(128) /* blockIdx.x threadIdx.x */
  • 15. 例:ヤコビ反復法(アルゴリズム) while ( error > tol ) { error = 0.0; for (int j = 1; j < N-1; j++) { for (int i = 1; i < M-1; i++) { Anew[j][i] = (A[j][i+1] + A[j][i-1] + A[j-1][i] + A[j+1][i]) * 0.25; error = max(error, abs(Anew[j][i] - A[j][i])); } } for (int j = 1; j < N-1; j++) { for (int i = 1; i < M-1; i++) { A[j][i] = Anew[j][i]; } } } A(i,j) A(i+1,j)A(i-1,j) A(i,j-1) A(i,j+1)
  • 16. 並列領域 (OpenACC)  Parallels と Kernels — 並列領域を指示  Parallels — 並列実行スタート  Kernels — 複数のカーネル while ( error > tol ) { error = 0.0; #pragma acc kernels for (int j = 1; j < N-1; j++) { for (int i = 1; i < M-1; i++) { Anew[j][i] = (A[j][i+1] + A[j][i-1] + A[j-1][i] + A[j+1][i]) * 0.25; error = max(error, abs(Anew[j][i] - A[j][i]); } } #pragma acc kernels for (int j = 1; j < N-1; j++) { for (int i = 1; i < M-1; i++) { A[j][i] = Anew[j][i]; } } }
  • 17. 簡単に解析(nvprof) OpenMP / OpenACC void saxpy(int n, float a, float *x, float *restrict y) { #pragma acc kernels copy(y[:n]) copyin(x[:n]) #pragma omp parallel for for (int i = 0; i < n; ++i) y[i] += a*x[i]; } ... saxpy(N, 3.0, x, y); ... $ pgcc -Minfo -acc saxpy.c saxpy: 16, Generating present_or_copy(y[:n]) Generating present_or_copyin(x[:n]) Generating Tesla code 19, Loop is parallelizable Accelerator kernel generated 19, #pragma acc loop gang, vector(128) /* blockIdx.x threadIdx.x */ $ nvprof ./a.out ==10302== NVPROF is profiling process 10302, command: ./a.out ==10302== Profiling application: ./a.out ==10302== Profiling result: Time(%) Time Calls Avg Min Max Name 62.95% 3.0358ms 2 1.5179ms 1.5172ms 1.5186ms [CUDA memcpy HtoD] 31.48% 1.5181ms 1 1.5181ms 1.5181ms 1.5181ms [CUDA memcpy DtoH] 5.56% 268.31us 1 268.31us 268.31us 268.31us saxpy_19_gpu
  • 19. 過剰なメモリ転送 while ( error > tol ) { error = 0.0; #pragma acc kernels for (int j = 1; j < N-1; j++) { for (int i = 1; i < M-1; i++) { Anew[j][i] = (A[j][i+1] + A[j][i-1] + A[j-1][i] + A[j+1][i]) * 0.25; error = max(error, abs(Anew[j][i] - A[j][i]); } } #pragma acc kernels for (int j = 1; j < N-1; j++) { for (int i = 1; i < M-1; i++) { A[j][i] = Anew[j][i]; } } } 配列Aへメモリ転送 (CPU->GPU) 配列Anewへメモリ転送 (CPU->GPU) 配列Anewへメモリ転送 (GPU->CPU) 配列Aへメモリ転送 (GPU->CPU)
  • 20. メモリ転送のタイミングを制御 データ制御ディレクティブ copyin (CPUGPU) copyout (CPUGPU) copy create present pcopyin pcopyout pcopy pcreate #pragma acc data pcopy(A, Anew) while ( error > tol ) { error = 0.0; #pragma acc kernels pcopy(Anew[:][:]) pcopyin(A[:][:]) for (int j = 1; j < N-1; j++) { for (int i = 1; i < M-1; i++) { Anew[j][i] = (A[j][i+1] + A[j][i-1] + A[j-1][i] + A[j+1][i]) * 0.25; error = max(error, abs(Anew[j][i] - A[j][i]); } } #pragma acc kernels pcopy(A[:][:]) pcopyin(Anew[:][:]) for (int j = 1; j < N-1; j++) { for (int i = 1; i < M-1; i++) { A[j][i] = Anew[j][i]; } } }
  • 21. 性能比較 Time(sec) Speedup CPU1 OpenMP thread 26.186 -- OpenACC(最適化前) 13.638 1.92x OpenACC(最適化後) 0.773 33.88x Ubuntu 14.04LTS 64bit CPU:Intel Xeon CPU E5-1603 v3@2.8GHz x 4 GPU:Tesla K40c