SlideShare ist ein Scribd-Unternehmen logo
1 von 58
Downloaden Sie, um offline zu lesen
第2部 – OpenACC によるデータ移動の管理
Naruhiko Tan, Solution Architect, NVIDIA
OPENACC 講習会
COURSE OBJECTIVE
参加者のみなさんが、
OpenACC を⽤いてみなさん
⾃⾝のアプリケーションを加速
できるようにすること
第2部のアウトライン
カバーするトピック
§ CPU と GPU メモリ
§ CUDA Unified (Managed) Memory
§ OpenACC データ管理
第1部の復習
OPENACC による開発サイクル
分析
並列化最適化
§ 分析 - コードを分析し、並列化や最適
化が必要と思われる箇所を⾒出す。
§ 並列化 - 最も処理に時間がかかる箇所
からコードの並列化を⾏う。計算結果が正
しいことも確認する。
§ 最適化 – 並列化によって得られた性能
から、さらなる⾼速化を図る。
OpenACC ディレクティブ
データ移動の
管理
並列実⾏の
開始
ループ マッピングの
最適化
#pragma acc data copyin(a,b) copyout(c)
{
...
#pragma acc parallel
{
#pragma acc loop gang vector
for (i = 0; i < n; ++i) {
c[i] = a[i] + b[i];
...
}
}
...
}
CPU, GPU, Manycore
移植性
相互操作可能
1つのソース コード
段階的
OpenACC ディレクティブ
第2部︓
データ移動の
管理
第1部︓
並列実⾏の
開始
#pragma acc data copyin(a,b) copyout(c)
{
...
#pragma acc parallel
{
#pragma acc loop gang vector
for (i = 0; i < n; ++i) {
c[i] = a[i] + b[i];
...
}
}
...
}
CPU, GPU, Manycore
移植性
相互操作可能
1つのソース コード
段階的
第3部︓
ループマッピン
グの最適化
while ( err > tol && iter < iter_max ) {
err=0.0;
#pragma acc parallel loop reduction(max:err)
for( int j = 1; j < n-1; j++) {
for( int i = 1; i < m-1; i++ ) {
Anew[OFFSET(j, i, m)] = 0.25 * ( A[OFFSET(j, i+1, m)] + A[OFFSET(j, i-1, m)]
+ A[OFFSET(j-1, i, m)] + A[OFFSET(j+1, i, m)]);
error = fmax( error, fabs(Anew[OFFSET(j, i, m)] - A[OFFSET(j, i , m)]));
}
}
#pragma acc parallel loop
for( int j = 1; j < n-1; j++) {
for( int i = 1; i < m-1; i++ ) {
A[OFFSET(j, i, m)] = Anew[OFFSET(j, i, m)];
}
}
iter++;
}
OPENACC PARALLEL LOOP による並列化
8
最初のループを並列化
max reduction を指定
2つ⽬のループを並列化
どのループを並列化するかのみを指⽰し、
どのように並列化するかの詳細は指⽰
していない。
OPENACC による⾼速化
1.00X
3.05X
10.18X
37.14X
0.00X
5.00X
10.00X
15.00X
20.00X
25.00X
30.00X
35.00X
40.00X
SERIAL MULTICORE NVIDIA TESLA K80 NVIDIA TESLA V100
Speed-Up
Speed-up
PGI 18.7, NVIDIA Tesla V100, Intel i9-7900X CPU @ 3.30GHz
CPU と GPU メモリ
CPU + GPU
構成図
§ 容量は CPU メモリの⽅が⼤きく、バンド幅は GPU メ
モリの⽅が広い。
§ CPU と GPU のメモリはそれぞれ独⽴しており、何らか
の I/O バスによって接続されている (伝統的には
PCI-e が⽤いられる)。
§ CPU – GPU 間で転送されるあらゆるデータは、I/O バ
スを通して⾏われる。
§ GPU のメモリバンド幅に⽐べて、I/O バスは遅い。
§ GPU メモリ上にデータがない限り、GPU は計算を⾏う
ことができない。
High
Capacity
Memory
Shared Cache
High Bandwidth
Memory
Shared Cache
$ $ $ $ $ $ $ $
$ $ $ $ $ $
$ $ $ $ $ $
IO Bus
GPUCPU
CUDA UNIFIED MEMORY
開発者の労⼒を軽減
Without Managed Memory With Managed Memory
Managed Memoryシステム メモリ GPU メモリ
“Managed memory”
とも呼ばれる
CUDA UNIFIED MEMORY
CPU と GPU のメモリが
1つの共有メモリ空間として統合
CUDA MANAGED MEMORY
§ 明⽰的にホスト-デバイス (CPU-GPU) 間のデータ転送を取り扱うのは、難しい場合がある。
§ CUDA Managed Memory を活⽤することにより、データ管理を PGI コンパイラに任せることができ
る。
§ これにより、開発者はデータ管理については最適化としてとらえて、まずは並列化に集中することが
できる。
有⽤性
$ pgcc –fast –acc –ta=tesla:managed –Minfo=accel main.c
$ pgfortran –fast –acc –ta=tesla:managed –Minfo=accel main.f90
MANAGED MEMORY
§ ほぼ全ての場合において、⼿動でデータ転送を⾏うこと
で、より良いパフォーマンスを得ることができる。
§ メモリの確保/開放は、managed memory を⽤いた
⽅がより時間がかかる。
§ データ転送を⾮同期で⾏うことはできない。
§ 今現在、PGI コンパイラと NVIDIA GPU の組み合わせ
でのみ利⽤可能。
制限事項
With Managed Memory
Managed Memory
* Slide Courtesy of PGI
第1部では UNIFIED MEMORY を利⽤
Why?
§ PGI と NVIDIA GPU への依存を排除。
§ 現状のコードでは、データは “少し遅い” タイミングで GPU に到着しているので、改善してみましょ
う。
Unified Memory なしでコードを実⾏してみましょう
基本的なデータ管理
基本的なデータ管理
§ ホストは CPU。
§ デバイスは何らかのアクセラレータ。
§ ターゲット ハードウェアがマルチ コアCPUの場合、ホ
ストとデバイスは同⼀となる。つまり、メモリも同⼀と
なる。
§ マルチ コアのように、メモリ空間が共有されたアクセ
ラレータを使う場合は、明⽰的なデータ管理の必要
はない。
ホスト - デバイス間
Host
Device
Host
Memory
Device
Memory
基本的なデータ管理
§ ターゲット ハードウェアが GPU の場合、CPU-GPU
間でのデータ転送が必要となる。
§ GPU で使われる配列は、GPU 上でメモリ確保され
ていなければならない。
§ CPU か GPU 上のデータが更新された場合、もう⼀
⽅のデータも更新しなければならない。
ホスト – デバイス間
High
Capacity
Memory
Shared Cache
High Bandwidth
Memory
Shared Cache
$ $ $ $ $ $ $ $
$ $ $ $ $ $
$ $ $ $ $ $
IO Bus
GPUCPU
“MANAGED” オプションなしでビルド
pgcc -ta=tesla -Minfo=accel laplace2d.c jacobi.c
laplace2d.c:
PGC-S-0155-Compiler failed to translate accelerator region (see -Minfo
messages): Could not find allocated-variable index for symbol (laplace2d.c: 47)
calcNext:
47, Accelerator kernel generated
Generating Tesla code
48, #pragma acc loop gang /* blockIdx.x */
Generating reduction(max:error)
50, #pragma acc loop vector(128) /* threadIdx.x */
48, Accelerator restriction: size of the GPU copy of Anew,A is unknown
50, Loop is parallelizable
PGC-F-0704-Compilation aborted due to previous errors. (laplace2d.c)
PGC/x86-64 Linux 18.7-0: compilation aborted
jacobi.c:
–ta=tesla:managed から “managed” を削除
データ整形
DATA クローズ
copy ( list ) GPU 上にメモリを確保し、データ領域に⼊る際に、ホストから GPU にデータを
コピーし、データ領域から出る際に、GPU からホストにデータをコピー。
主な使⽤例: GPU へのインプットとなり、かつ上書きされ、ホストに返される
様々なデータについては、これがデフォルト。
copyin ( list ) GPU 上にメモリを確保し、データ領域に⼊る際に、ホストから GPU にデータを
コピー。
主な使⽤例: あるサブルーチンに対するインプット配列とみなせる。
copyout ( list ) GPU 上にメモリを確保し、データ領域から出る際に、GPU からホストにデータを
コピー。
主な使⽤例: インプット データを上書きしない計算結果。
create ( list ) GPU 上にメモリを確保するが、データ コピーは⾏わない。
主な使⽤例: ⼀時配列。
配列の整形
§ コンパイラが配列の形を理解するのに、プログラマの助けが必要な場合がある。
§ 最初の数字は、配列要素の最初のインデックス。
§ C/C++ では、2番めの数字は転送される配列の⻑さ。
§ Fortran では、2番めの数字は最後のインデックス。
copy(array(starting_index:ending_index))
copy(array[starting_index:length]) C/C++
Fortran
配列の整形 (続き)
多次元配列
copy(array(1:N, 1:M))
copy(array[0:N][0:M]) C/C++
Fortran
これらの例は、2次元配列をデバイスにコピーする
配列の整形 (続き)
部分配列
copy(array(i*N/4:i*N/4+N/4))
copy(array[i*N/4:N/4]) C/C++
Fortran
これらの例は、配列全体の ¼ のみデバイスにコピーする
while ( err > tol && iter < iter_max ) {
err=0.0;
#pragma acc parallel loop reduction(max:err) copyin(A[0:n*m]) copy(Anew[0:n*m])
for( int j = 1; j < n-1; j++) {
for( int i = 1; i < m-1; i++ ) {
Anew[OFFSET(j, i, m)] = 0.25 * ( A[OFFSET(j, i+1, m)] + A[OFFSET(j, i-1, m)]
+ A[OFFSET(j-1, i, m)] + A[OFFSET(j+1, i, m)]);
error = fmax( error, fabs(Anew[OFFSET(j, i, m)] - A[OFFSET(j, i , m)]));
}
}
#pragma acc parallel loop copyin(Anew[0:n*m]) copyout(A[0:n*m])
for( int j = 1; j < n-1; j++) {
for( int i = 1; i < m-1; i++ ) {
A[OFFSET(j, i, m)] = Anew[OFFSET(j, i, m)];
}
}
iter++;
}
最適化されたデータ転送
データ クローズで配列
形状を指定
“MANAGED” オプションなしでビルド
pgcc -ta=tesla -Minfo=accel laplace2d.c jacobi.c laplace2d.c:
calcNext:
47, Generating copyin(A[:m*n])
Accelerator kernel generated
Generating Tesla code
48, #pragma acc loop gang /* blockIdx.x */
Generating reduction(max:error)
50, #pragma acc loop vector(128) /* threadIdx.x */
47, Generating implicit copy(error)
Generating copy(Anew[:m*n])
50, Loop is parallelizable
swap:
62, Generating copyin(Anew[:m*n])
Generating copyout(A[:m*n])
Accelerator kernel generated
Generating Tesla code
63, #pragma acc loop gang /* blockIdx.x */
65, #pragma acc loop vector(128) /* threadIdx.x */
65, Loop is parallelizable
jacobi.c:
–ta=tesla:managed から “managed” を削除
OPENACC による ⾼速化 低速化︖
1.00X
3.23X
41.80X
0.33X
0.00X
5.00X
10.00X
15.00X
20.00X
25.00X
30.00X
35.00X
40.00X
45.00X
SERIAL MULTICORE V100 V100 (DATA CLAUSES)
Speed-Up
Speed-up
問題は何か︖
§ Magaged memory オプションなしでビルドするのに必要な情報は全て揃っているはずだが、実⾏
時間が⼤幅に増加。
§ ここでプロファイリング ツールが活躍。
アプリケーションのプロファイル (2 STEPS)
アプリケーションのプロファイル (2 STEPS)
データコピー
実⾏時間のブレークダウン
Data Copy H2D Data Copy D2H CalcNext Swap
ほとんど全ての時間が
ホスト-デバイス間の
データ転送に費やされ
ている
while ( err > tol && iter < iter_max ) {
err=0.0;
#pragma acc parallel loop reduction(max:err) copyin(A[0:n*m]) copy(Anew[0:n*m])
for( int j = 1; j < n-1; j++) {
for( int i = 1; i < m-1; i++ ) {
Anew[OFFSET(j, i, m)] = 0.25 * ( A[OFFSET(j, i+1, m)] + A[OFFSET(j, i-1, m)]
+ A[OFFSET(j-1, i, m)] + A[OFFSET(j+1, i, m)]);
error = fmax( error, fabs(Anew[OFFSET(j, i, m)] - A[OFFSET(j, i , m)]));
}
}
#pragma acc parallel loop copyin(Anew[0:n*m]) copyout(A[0:n*m])
for( int j = 1; j < n-1; j++) {
for( int i = 1; i < m-1; i++ ) {
A[OFFSET(j, i, m)] = Anew[OFFSET(j, i, m)];
}
}
iter++;
}
最適化されたデータ転送
while ループのイタレー
ションごとにデータをコ
ピーしているが、それら
を再利⽤可能︖
最適化されたデータ転送
OPENACC DATA ディレクティブ
§ data ディレクティブは、個々のループをま
たいで、データがデバイスに存在するライフ
タイムを定義する。
§ データ領域中は、デバイスがデータを所有
している。
§ data クローズは、データ領域でのデータ
転送と形状を表現する。
定義
#pragma acc data clauses
{
< Sequential and/or Parallel code >
}
!$acc data clauses
< Sequential and/or Parallel code >
!$acc end data
STRUCTURED DATA ディレクティブ
使⽤例
#pragma acc data copyin(a[0:N],b[0:N]) copyout(c[0:N])
{
#pragma acc parallel loop
for(int i = 0; i < N; i++){
c[i] = a[i] + b[i];
}
}
動作
ホスト メモリ デバイス メモリ
A B C
デバイス上に A の
メモリ領域を確保
A を CPU からデ
バイスにコピー
A
デバイス上に B の
メモリ領域を確保
B を CPU から
デバイスにコピー
B
デバイス上に C の
メモリ領域を確保
デバイス上で
ループを実⾏
C’
C をデバイスから
CPU へコピー
C’
デバイス上の
C を解放
デバイス上の
B を解放
デバイス上の
A を解放
#pragma acc data copy(A[0:n*m]) copyin(Anew[0:n*m])
while ( err > tol && iter < iter_max ) {
err=0.0;
#pragma acc parallel loop reduction(max:err) copyin(A[0:n*m]) copy(Anew[0:n*m])
for( int j = 1; j < n-1; j++) {
for( int i = 1; i < m-1; i++ ) {
Anew[OFFSET(j, i, m)] = 0.25 * ( A[OFFSET(j, i+1, m)] + A[OFFSET(j, i-1, m)]
+ A[OFFSET(j-1, i, m)] + A[OFFSET(j+1, i, m)]);
error = fmax( error, fabs(Anew[OFFSET(j, i, m)] - A[OFFSET(j, i , m)]));
}
}
#pragma acc parallel loop copyin(Anew[0:n*m]) copyout(A[0:n*m])
for( int j = 1; j < n-1; j++) {
for( int i = 1; i < m-1; i++ ) {
A[OFFSET(j, i, m)] = Anew[OFFSET(j, i, m)];
}
}
iter++;
}
最適化されたデータ転送
必要な時のみ A をコピー。
Anew の初期条件はコピーす
るが、最終的な値はしない。
コードを再度ビルド
pgcc -fast -ta=tesla -Minfo=accel laplace2d_uvm.c
main:
60, Generating copy(A[:m*n])
Generating copyin(Anew[:m*n])
64, Accelerator kernel generated
Generating Tesla code
64, Generating reduction(max:error)
65, #pragma acc loop gang /* blockIdx.x */
67, #pragma acc loop vector(128) /* threadIdx.x */
67, Loop is parallelizable
75, Accelerator kernel generated
Generating Tesla code
76, #pragma acc loop gang /* blockIdx.x */
78, #pragma acc loop vector(128) /* threadIdx.x */
78, Loop is parallelizable
データ転送はデータ領域で
のみ発生。
OPENACC による⾼速化
1.00X
3.23X
41.80X 42.99X
0.00X
5.00X
10.00X
15.00X
20.00X
25.00X
30.00X
35.00X
40.00X
45.00X
50.00X
SERIAL MULTICORE V100 V100 (DATA)
Speed-Up
Speed-up
これまでに学んだこと
§ CUDA Unified (Managed) Memory はポーティングのための強⼒なツール。
§ Managed memory を活⽤せずに GPU プログラミングを⾏う場合は、データ転送に際して配列の
形状を指定する必要がある。
§ 各ループごとにデータ転送を⾏うのは、概して⾮効率。
§ OpenACC data 領域によって、データ転送と計算を別々に管理することができる。
データの同期
update: ホストとデバイス間でデータを明⽰的に転送する
データ領域の途中でデータを同期したい場合に有効
クローズ:
self: ホスト側のデータをデバイス側のデータと⼀致させる
device: デバイス側のデータをホスト側のデータと⼀致させる
#pragma acc update self(x[0:count])
#pragma acc update device(x[0:count])
!$acc update self(x(1:end_index))
!$acc update device(x(1:end_index))
Fortran
C/C++
OPENACC UPDATE ディレクティブ
BB*
A*A
OPENACC UPDATE ディレクティブ
A
CPU Memory device Memory
#pragma acc update device(A[0:N])
B*
#pragma acc update self(B[0:N])
update ディレクティブが動作
するためには、CPU とデバイ
ス両⽅にデータが存在してい
る必要がある。
UPDATE でデータ同期
int* A=(int*) malloc(N*sizeof(int))
#pragma acc data create(A[0:N])
while( timesteps++ < numSteps )
{
#pragma acc parallel loop
for(int i = 0; i < N; i++){
a[i] *= 2;
}
if (timestep % 100 ) {
#pragma acc update self(A[0:N])
checkpointAToFile(A, N);
}
}
§ データ領域中で、ホストあるいはデバイス側のデー
タが上書きされる時がある。
§ データ領域を終了し、再度新しいデータ領域を開
始するのはコストがかかる。
§ 代わりに、ホストとデバイス側のデータが同⼀となる
よう更新。
§ 例︓ファイル I/O、通信、etc…
⾮構造 DATA ディレクティブ
⾮構造 DATA ディレクティブ
§ データのライフタイムは、必ずしもきれいに構造
化されているとは限らない。
§ Enter data ディレクティブはデバイスのメモリ
確保を処理する。
§ メモリ確保のために、create か copyin のど
ちらかを使うことができる。
§ 複数の enter data ディレクティブを挿⼊する
ことができるので、その enter data ディレク
ティブが、data 領域の開始とは限らない。
Enter Data ディレクティブ
#pragma acc enter data clauses
< Sequential and/or Parallel code >
#pragma acc exit data clauses
!$acc enter data clauses
< Sequential and/or Parallel code >
!$acc exit data clauses
⾮構造 DATA ディレクティブ
§ Exit data では、デバイスのメモリ解放を処理
する。
§ メモリ解放のために、delete か copyout のど
ちらかを使うことができる。
§ ある配列に対して、enter data の数だけ
exit data を挿⼊する。
§ これらは、別々の関数に挿⼊することができる。
Exit Data ディレクティブ
#pragma acc enter data clauses
< Sequential and/or Parallel code >
#pragma acc exit data clauses
!$acc enter data clauses
< Sequential and/or Parallel code >
!$acc exit data clauses
⾮構造 DATA クローズ
copyin ( list ) enter data に際し、デバイス上にメモリを確保し、ホストからデバイスへデータ
をコピー。
copyout ( list ) exit data に際し、デバイスからホストへデータをコピーし、デバイス上のメモリ
を解放。
create ( list ) enter data に際し、データ転送なしでデバイス上にメモリを確保。
delete ( list ) exit data に際し、データ転送なしでデバイス上のメモリを解放。
⾮構造 DATA ディレクティブ
基本的な例
#pragma acc parallel loop
for(int i = 0; i < N; i++){
c[i] = a[i] + b[i];
}
⾮構造 DATA ディレクティブ
基本的な例
#pragma acc enter data copyin(a[0:N],b[0:N]) create(c[0:N])
#pragma acc parallel loop
for(int i = 0; i < N; i++){
c[i] = a[i] + b[i];
}
#pragma acc exit data copyout(c[0:N]) delete(a,b)
⾮構造 VS. 構造
簡単なコードを例に
#pragma acc enter data copyin(a[0:N],b[0:N]) 
create(c[0:N])
#pragma acc parallel loop
for(int i = 0; i < N; i++){
c[i] = a[i] + b[i];
}
#pragma acc exit data copyout(c[0:N]) 
delete(a,b)
#pragma acc data copyin(a[0:N],b[0:N]) 
copyout(c[0:N])
{
#pragma acc parallel loop
for(int i = 0; i < N; i++){
c[i] = a[i] + b[i];
}
}
⾮構造 構造
§ 複数の開始/終了ポイントを持ち得る。
§ 異なる関数にまたがることができる。
§ 解放されるまではメモリは確保されたまま。
§ 明⽰的に開始/終了ポイントが必要。
§ 1つの関数内に収まる必要がある。
§ メモリはデータ領域中のみ確保される。
⾮構造 DATA ディレクティブ
複数の関数をまたいでの利⽤
int* allocate_array(int N){
int* ptr = (int *) malloc(N * sizeof(int));
#pragma acc enter data create(ptr[0:N])
return ptr;
}
void deallocate_array(int* ptr){
#pragma acc exit data delete(ptr)
free(ptr);
}
int main(){
int* a = allocate_array(100);
#pragma acc kernels
{
a[0] = 0;
}
deallocate_array(a);
}
§ この例では、enter data と exit data がそれぞれ
異なる関数で宣⾔されている。
§ プログラマはデバイス メモリの確保/解放をホスト メ
モリのそれと対応させることができる。
§ C++ のような、構造化スコープの設定が難しい場
合に特に有効。
C/C++ 構造体/クラス
typedef struct {
float x, y, z;
} float3;
int main(int argc, char* argv[]){
int N = 10;
float3* f3 = malloc(N * sizeof(float3));
#pragma acc enter data create(f3[0:N])
#pragma acc kernels
for(int i = 0; i < N; i++){
f3[i].x = 0.0f;
f3[i].y = 0.0f;
f3[i].z = 0.0f;
}
#pragma acc exit data delete(f3)
free(f3);
}
C 構造体
動的なメンバなしの場合
§ 動的なメンバとは、動的にメモリ確保される配
列のような、構造体内の可変サイズを持つメ
ンバのこと。
§ Float3 構造体のメンバは全て固定⻑の変数
なので、OpenACC はこの構造体をデバイス
メモリにコピーすることができる。
§ 動的にメモリが確保される配列が構造体に含
まれていたらどうなるか︖
C 構造体
動的なメンバを含む場合 typedef struct {
float *arr;
int n;
} vector;
int main(int argc, char* argv[]){
vector v;
v.n = 10;
v.arr = (float*) malloc(v.n*sizeof(float));
#pragma acc enter data copyin(v)
#pragma acc enter data create(v.arr[0:v.n])
...
#pragma acc exit data delete(v.arr)
#pragma acc exit data delete(v)
free(v.arr);
}
§ OpenACC は構造体とその動的メンバをコ
ピーするのに⼗分な情報を与えられていない。
§ まず最初に構造体をデバイス メモリにコピーし、
その後に動的メンバのメモリを確保、あるいは
コピーする。
§ メモリ解放時は、動的メンバ、構造体の順に
処理する。
§ OpenACC は動的メンバを⾃動的に構造体
にアタッチする。
おわりに
キー コンセプト
この講義で学んだこと…
§ CPU と GPU の違いと、Unified Memory。
§ OpenACC 配列の整形。
§ OpenACC Data クローズ。
§ OpenACC 構造 Data 領域。
§ OpenACC Update ディレクティブ。
§ OpenACC ⾮構造 Data ディレクティブ。

Weitere ähnliche Inhalte

Was ist angesagt?

FPGAをロボット(ROS)で「やわらかく」使うには
FPGAをロボット(ROS)で「やわらかく」使うにはFPGAをロボット(ROS)で「やわらかく」使うには
FPGAをロボット(ROS)で「やわらかく」使うにはHideki Takase
 
整数列圧縮
整数列圧縮整数列圧縮
整数列圧縮JAVA DM
 
深層学習の数理
深層学習の数理深層学習の数理
深層学習の数理Taiji Suzuki
 
GPU と PYTHON と、それから最近の NVIDIA
GPU と PYTHON と、それから最近の NVIDIAGPU と PYTHON と、それから最近の NVIDIA
GPU と PYTHON と、それから最近の NVIDIANVIDIA Japan
 
ディープラーニングのフレームワークと特許戦争
ディープラーニングのフレームワークと特許戦争ディープラーニングのフレームワークと特許戦争
ディープラーニングのフレームワークと特許戦争Yosuke Shinya
 
第1回ROS勉強会発表資料 ROS+Gazeboではじめるロボットシミュレーション
第1回ROS勉強会発表資料 ROS+Gazeboではじめるロボットシミュレーション第1回ROS勉強会発表資料 ROS+Gazeboではじめるロボットシミュレーション
第1回ROS勉強会発表資料 ROS+Gazeboではじめるロボットシミュレーションakio19937
 
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
画像処理ライブラリ OpenCV で 出来ること・出来ないこと画像処理ライブラリ OpenCV で 出来ること・出来ないこと
画像処理ライブラリ OpenCV で 出来ること・出来ないことNorishige Fukushima
 
数学プログラムを Haskell で書くべき 6 の理由
数学プログラムを Haskell で書くべき 6 の理由数学プログラムを Haskell で書くべき 6 の理由
数学プログラムを Haskell で書くべき 6 の理由Hiromi Ishii
 
【DL輪読会】Llama 2: Open Foundation and Fine-Tuned Chat Models
【DL輪読会】Llama 2: Open Foundation and Fine-Tuned Chat Models【DL輪読会】Llama 2: Open Foundation and Fine-Tuned Chat Models
【DL輪読会】Llama 2: Open Foundation and Fine-Tuned Chat ModelsDeep Learning JP
 
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~Daisuke Morishita
 
最近のDeep Learning (NLP) 界隈におけるAttention事情
最近のDeep Learning (NLP) 界隈におけるAttention事情最近のDeep Learning (NLP) 界隈におけるAttention事情
最近のDeep Learning (NLP) 界隈におけるAttention事情Yuta Kikuchi
 
Dockerを支える技術
Dockerを支える技術Dockerを支える技術
Dockerを支える技術Etsuji Nakai
 
Marp for VS Code で作る PowerPoint スライド
Marp for VS Code で作る PowerPoint スライドMarp for VS Code で作る PowerPoint スライド
Marp for VS Code で作る PowerPoint スライドIosif Takakura
 
「統計的学習理論」第1章
「統計的学習理論」第1章「統計的学習理論」第1章
「統計的学習理論」第1章Kota Matsui
 
失敗から学ぶ機械学習応用
失敗から学ぶ機械学習応用失敗から学ぶ機械学習応用
失敗から学ぶ機械学習応用Hiroyuki Masuda
 
圏論のモナドとHaskellのモナド
圏論のモナドとHaskellのモナド圏論のモナドとHaskellのモナド
圏論のモナドとHaskellのモナドYoshihiro Mizoguchi
 
You Only Look One-level Featureの解説と見せかけた物体検出のよもやま話
You Only Look One-level Featureの解説と見せかけた物体検出のよもやま話You Only Look One-level Featureの解説と見せかけた物体検出のよもやま話
You Only Look One-level Featureの解説と見せかけた物体検出のよもやま話Yusuke Uchida
 
データサイエンス概論第一=2-1 データ間の距離と類似度
データサイエンス概論第一=2-1 データ間の距離と類似度データサイエンス概論第一=2-1 データ間の距離と類似度
データサイエンス概論第一=2-1 データ間の距離と類似度Seiichi Uchida
 

Was ist angesagt? (20)

FPGAをロボット(ROS)で「やわらかく」使うには
FPGAをロボット(ROS)で「やわらかく」使うにはFPGAをロボット(ROS)で「やわらかく」使うには
FPGAをロボット(ROS)で「やわらかく」使うには
 
整数列圧縮
整数列圧縮整数列圧縮
整数列圧縮
 
深層学習の数理
深層学習の数理深層学習の数理
深層学習の数理
 
次元の呪い
次元の呪い次元の呪い
次元の呪い
 
GPU と PYTHON と、それから最近の NVIDIA
GPU と PYTHON と、それから最近の NVIDIAGPU と PYTHON と、それから最近の NVIDIA
GPU と PYTHON と、それから最近の NVIDIA
 
HPE Superdome X ご紹介資料
HPE Superdome X ご紹介資料HPE Superdome X ご紹介資料
HPE Superdome X ご紹介資料
 
ディープラーニングのフレームワークと特許戦争
ディープラーニングのフレームワークと特許戦争ディープラーニングのフレームワークと特許戦争
ディープラーニングのフレームワークと特許戦争
 
第1回ROS勉強会発表資料 ROS+Gazeboではじめるロボットシミュレーション
第1回ROS勉強会発表資料 ROS+Gazeboではじめるロボットシミュレーション第1回ROS勉強会発表資料 ROS+Gazeboではじめるロボットシミュレーション
第1回ROS勉強会発表資料 ROS+Gazeboではじめるロボットシミュレーション
 
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
画像処理ライブラリ OpenCV で 出来ること・出来ないこと画像処理ライブラリ OpenCV で 出来ること・出来ないこと
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
 
数学プログラムを Haskell で書くべき 6 の理由
数学プログラムを Haskell で書くべき 6 の理由数学プログラムを Haskell で書くべき 6 の理由
数学プログラムを Haskell で書くべき 6 の理由
 
【DL輪読会】Llama 2: Open Foundation and Fine-Tuned Chat Models
【DL輪読会】Llama 2: Open Foundation and Fine-Tuned Chat Models【DL輪読会】Llama 2: Open Foundation and Fine-Tuned Chat Models
【DL輪読会】Llama 2: Open Foundation and Fine-Tuned Chat Models
 
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
 
最近のDeep Learning (NLP) 界隈におけるAttention事情
最近のDeep Learning (NLP) 界隈におけるAttention事情最近のDeep Learning (NLP) 界隈におけるAttention事情
最近のDeep Learning (NLP) 界隈におけるAttention事情
 
Dockerを支える技術
Dockerを支える技術Dockerを支える技術
Dockerを支える技術
 
Marp for VS Code で作る PowerPoint スライド
Marp for VS Code で作る PowerPoint スライドMarp for VS Code で作る PowerPoint スライド
Marp for VS Code で作る PowerPoint スライド
 
「統計的学習理論」第1章
「統計的学習理論」第1章「統計的学習理論」第1章
「統計的学習理論」第1章
 
失敗から学ぶ機械学習応用
失敗から学ぶ機械学習応用失敗から学ぶ機械学習応用
失敗から学ぶ機械学習応用
 
圏論のモナドとHaskellのモナド
圏論のモナドとHaskellのモナド圏論のモナドとHaskellのモナド
圏論のモナドとHaskellのモナド
 
You Only Look One-level Featureの解説と見せかけた物体検出のよもやま話
You Only Look One-level Featureの解説と見せかけた物体検出のよもやま話You Only Look One-level Featureの解説と見せかけた物体検出のよもやま話
You Only Look One-level Featureの解説と見せかけた物体検出のよもやま話
 
データサイエンス概論第一=2-1 データ間の距離と類似度
データサイエンス概論第一=2-1 データ間の距離と類似度データサイエンス概論第一=2-1 データ間の距離と類似度
データサイエンス概論第一=2-1 データ間の距離と類似度
 

Ähnlich wie 20190625 OpenACC 講習会 第2部

NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012Takuro Iizuka
 
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティングCMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティングComputational Materials Science Initiative
 
Rにおける大規模データ解析(第10回TokyoWebMining)
Rにおける大規模データ解析(第10回TokyoWebMining)Rにおける大規模データ解析(第10回TokyoWebMining)
Rにおける大規模データ解析(第10回TokyoWebMining)Shintaro Fukushima
 
Sparkパフォーマンス検証
Sparkパフォーマンス検証Sparkパフォーマンス検証
Sparkパフォーマンス検証BrainPad Inc.
 
CAメインフレーム システムリソース削減に貢献する製品について
CAメインフレーム システムリソース削減に貢献する製品についてCAメインフレーム システムリソース削減に貢献する製品について
CAメインフレーム システムリソース削減に貢献する製品についてKaneko Izumi
 
Maatkit で MySQL チューニング
Maatkit で MySQL チューニングMaatkit で MySQL チューニング
Maatkit で MySQL チューニングKensuke Nagae
 
20181212 - PGconf.ASIA - LT
20181212 - PGconf.ASIA - LT20181212 - PGconf.ASIA - LT
20181212 - PGconf.ASIA - LTKohei KaiGai
 
1072: アプリケーション開発を加速するCUDAライブラリ
1072: アプリケーション開発を加速するCUDAライブラリ1072: アプリケーション開発を加速するCUDAライブラリ
1072: アプリケーション開発を加速するCUDAライブラリNVIDIA Japan
 
TPC-DSから学ぶPostgreSQLの弱点と今後の展望
TPC-DSから学ぶPostgreSQLの弱点と今後の展望TPC-DSから学ぶPostgreSQLの弱点と今後の展望
TPC-DSから学ぶPostgreSQLの弱点と今後の展望Kohei KaiGai
 
pgconfasia2016 lt ssd2gpu
pgconfasia2016 lt ssd2gpupgconfasia2016 lt ssd2gpu
pgconfasia2016 lt ssd2gpuKohei KaiGai
 
Kai = (Dynamo + memcache API) / Erlang
Kai = (Dynamo + memcache API) / ErlangKai = (Dynamo + memcache API) / Erlang
Kai = (Dynamo + memcache API) / ErlangTakeru INOUE
 
機械学習 / Deep Learning 大全 (5) Tool編
機械学習 / Deep Learning 大全 (5) Tool編機械学習 / Deep Learning 大全 (5) Tool編
機械学習 / Deep Learning 大全 (5) Tool編Daiyu Hatakeyama
 
20170127 JAWS HPC-UG#8
20170127 JAWS HPC-UG#820170127 JAWS HPC-UG#8
20170127 JAWS HPC-UG#8Kohei KaiGai
 
Linuxのプロセススケジューラ(Reading the Linux process scheduler)
Linuxのプロセススケジューラ(Reading the Linux process scheduler)Linuxのプロセススケジューラ(Reading the Linux process scheduler)
Linuxのプロセススケジューラ(Reading the Linux process scheduler)Hiraku Toyooka
 
遊休リソースを用いた 相同性検索処理の並列化とその評価
遊休リソースを用いた相同性検索処理の並列化とその評価遊休リソースを用いた相同性検索処理の並列化とその評価
遊休リソースを用いた 相同性検索処理の並列化とその評価Satoshi Nagayasu
 
PF部2011年12月勉強会.androidsola
PF部2011年12月勉強会.androidsolaPF部2011年12月勉強会.androidsola
PF部2011年12月勉強会.androidsolaandroid sola
 
Kof2016 postgresql-9.6
Kof2016 postgresql-9.6Kof2016 postgresql-9.6
Kof2016 postgresql-9.6Toshi Harada
 
Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14Masahiro Nagano
 
プロとしてのOracleアーキテクチャ入門 ~番外編~ @ Developers Summit 2009
プロとしてのOracleアーキテクチャ入門 ~番外編~ @ Developers Summit 2009プロとしてのOracleアーキテクチャ入門 ~番外編~ @ Developers Summit 2009
プロとしてのOracleアーキテクチャ入門 ~番外編~ @ Developers Summit 2009Ryota Watabe
 
Spark Analytics - スケーラブルな分散処理
Spark Analytics - スケーラブルな分散処理Spark Analytics - スケーラブルな分散処理
Spark Analytics - スケーラブルな分散処理Tusyoshi Matsuzaki
 

Ähnlich wie 20190625 OpenACC 講習会 第2部 (20)

NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012
 
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティングCMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
 
Rにおける大規模データ解析(第10回TokyoWebMining)
Rにおける大規模データ解析(第10回TokyoWebMining)Rにおける大規模データ解析(第10回TokyoWebMining)
Rにおける大規模データ解析(第10回TokyoWebMining)
 
Sparkパフォーマンス検証
Sparkパフォーマンス検証Sparkパフォーマンス検証
Sparkパフォーマンス検証
 
CAメインフレーム システムリソース削減に貢献する製品について
CAメインフレーム システムリソース削減に貢献する製品についてCAメインフレーム システムリソース削減に貢献する製品について
CAメインフレーム システムリソース削減に貢献する製品について
 
Maatkit で MySQL チューニング
Maatkit で MySQL チューニングMaatkit で MySQL チューニング
Maatkit で MySQL チューニング
 
20181212 - PGconf.ASIA - LT
20181212 - PGconf.ASIA - LT20181212 - PGconf.ASIA - LT
20181212 - PGconf.ASIA - LT
 
1072: アプリケーション開発を加速するCUDAライブラリ
1072: アプリケーション開発を加速するCUDAライブラリ1072: アプリケーション開発を加速するCUDAライブラリ
1072: アプリケーション開発を加速するCUDAライブラリ
 
TPC-DSから学ぶPostgreSQLの弱点と今後の展望
TPC-DSから学ぶPostgreSQLの弱点と今後の展望TPC-DSから学ぶPostgreSQLの弱点と今後の展望
TPC-DSから学ぶPostgreSQLの弱点と今後の展望
 
pgconfasia2016 lt ssd2gpu
pgconfasia2016 lt ssd2gpupgconfasia2016 lt ssd2gpu
pgconfasia2016 lt ssd2gpu
 
Kai = (Dynamo + memcache API) / Erlang
Kai = (Dynamo + memcache API) / ErlangKai = (Dynamo + memcache API) / Erlang
Kai = (Dynamo + memcache API) / Erlang
 
機械学習 / Deep Learning 大全 (5) Tool編
機械学習 / Deep Learning 大全 (5) Tool編機械学習 / Deep Learning 大全 (5) Tool編
機械学習 / Deep Learning 大全 (5) Tool編
 
20170127 JAWS HPC-UG#8
20170127 JAWS HPC-UG#820170127 JAWS HPC-UG#8
20170127 JAWS HPC-UG#8
 
Linuxのプロセススケジューラ(Reading the Linux process scheduler)
Linuxのプロセススケジューラ(Reading the Linux process scheduler)Linuxのプロセススケジューラ(Reading the Linux process scheduler)
Linuxのプロセススケジューラ(Reading the Linux process scheduler)
 
遊休リソースを用いた 相同性検索処理の並列化とその評価
遊休リソースを用いた相同性検索処理の並列化とその評価遊休リソースを用いた相同性検索処理の並列化とその評価
遊休リソースを用いた 相同性検索処理の並列化とその評価
 
PF部2011年12月勉強会.androidsola
PF部2011年12月勉強会.androidsolaPF部2011年12月勉強会.androidsola
PF部2011年12月勉強会.androidsola
 
Kof2016 postgresql-9.6
Kof2016 postgresql-9.6Kof2016 postgresql-9.6
Kof2016 postgresql-9.6
 
Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14
 
プロとしてのOracleアーキテクチャ入門 ~番外編~ @ Developers Summit 2009
プロとしてのOracleアーキテクチャ入門 ~番外編~ @ Developers Summit 2009プロとしてのOracleアーキテクチャ入門 ~番外編~ @ Developers Summit 2009
プロとしてのOracleアーキテクチャ入門 ~番外編~ @ Developers Summit 2009
 
Spark Analytics - スケーラブルな分散処理
Spark Analytics - スケーラブルな分散処理Spark Analytics - スケーラブルな分散処理
Spark Analytics - スケーラブルな分散処理
 

Mehr von NVIDIA Japan

HPC 的に H100 は魅力的な GPU なのか?
HPC 的に H100 は魅力的な GPU なのか?HPC 的に H100 は魅力的な GPU なのか?
HPC 的に H100 は魅力的な GPU なのか?NVIDIA Japan
 
NVIDIA cuQuantum SDK による量子回路シミュレーターの高速化
NVIDIA cuQuantum SDK による量子回路シミュレーターの高速化NVIDIA cuQuantum SDK による量子回路シミュレーターの高速化
NVIDIA cuQuantum SDK による量子回路シミュレーターの高速化NVIDIA Japan
 
Physics-ML のためのフレームワーク NVIDIA Modulus 最新事情
Physics-ML のためのフレームワーク NVIDIA Modulus 最新事情Physics-ML のためのフレームワーク NVIDIA Modulus 最新事情
Physics-ML のためのフレームワーク NVIDIA Modulus 最新事情NVIDIA Japan
 
20221021_JP5.0.2-Webinar-JP_Final.pdf
20221021_JP5.0.2-Webinar-JP_Final.pdf20221021_JP5.0.2-Webinar-JP_Final.pdf
20221021_JP5.0.2-Webinar-JP_Final.pdfNVIDIA Japan
 
開発者が語る NVIDIA cuQuantum SDK
開発者が語る NVIDIA cuQuantum SDK開発者が語る NVIDIA cuQuantum SDK
開発者が語る NVIDIA cuQuantum SDKNVIDIA Japan
 
NVIDIA Modulus: Physics ML 開発のためのフレームワーク
NVIDIA Modulus: Physics ML 開発のためのフレームワークNVIDIA Modulus: Physics ML 開発のためのフレームワーク
NVIDIA Modulus: Physics ML 開発のためのフレームワークNVIDIA Japan
 
NVIDIA HPC ソフトウエア斜め読み
NVIDIA HPC ソフトウエア斜め読みNVIDIA HPC ソフトウエア斜め読み
NVIDIA HPC ソフトウエア斜め読みNVIDIA Japan
 
HPC+AI ってよく聞くけど結局なんなの
HPC+AI ってよく聞くけど結局なんなのHPC+AI ってよく聞くけど結局なんなの
HPC+AI ってよく聞くけど結局なんなのNVIDIA Japan
 
Magnum IO GPUDirect Storage 最新情報
Magnum IO GPUDirect Storage 最新情報Magnum IO GPUDirect Storage 最新情報
Magnum IO GPUDirect Storage 最新情報NVIDIA Japan
 
データ爆発時代のネットワークインフラ
データ爆発時代のネットワークインフラデータ爆発時代のネットワークインフラ
データ爆発時代のネットワークインフラNVIDIA Japan
 
Hopper アーキテクチャで、変わること、変わらないこと
Hopper アーキテクチャで、変わること、変わらないことHopper アーキテクチャで、変わること、変わらないこと
Hopper アーキテクチャで、変わること、変わらないことNVIDIA Japan
 
GTC November 2021 – テレコム関連アップデート サマリー
GTC November 2021 – テレコム関連アップデート サマリーGTC November 2021 – テレコム関連アップデート サマリー
GTC November 2021 – テレコム関連アップデート サマリーNVIDIA Japan
 
テレコムのビッグデータ解析 & AI サイバーセキュリティ
テレコムのビッグデータ解析 & AI サイバーセキュリティテレコムのビッグデータ解析 & AI サイバーセキュリティ
テレコムのビッグデータ解析 & AI サイバーセキュリティNVIDIA Japan
 
必見!絶対におすすめの通信業界セッション 5 つ ~秋の GTC 2020~
必見!絶対におすすめの通信業界セッション 5 つ ~秋の GTC 2020~必見!絶対におすすめの通信業界セッション 5 つ ~秋の GTC 2020~
必見!絶対におすすめの通信業界セッション 5 つ ~秋の GTC 2020~NVIDIA Japan
 
2020年10月29日 プロフェッショナルAI×Roboticsエンジニアへのロードマップ
2020年10月29日 プロフェッショナルAI×Roboticsエンジニアへのロードマップ2020年10月29日 プロフェッショナルAI×Roboticsエンジニアへのロードマップ
2020年10月29日 プロフェッショナルAI×RoboticsエンジニアへのロードマップNVIDIA Japan
 
2020年10月29日 Jetson活用によるAI教育
2020年10月29日 Jetson活用によるAI教育2020年10月29日 Jetson活用によるAI教育
2020年10月29日 Jetson活用によるAI教育NVIDIA Japan
 
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教育NVIDIA Japan
 
COVID-19 研究・対策に活用可能な NVIDIA ソフトウェアと関連情報
COVID-19 研究・対策に活用可能な NVIDIA ソフトウェアと関連情報COVID-19 研究・対策に活用可能な NVIDIA ソフトウェアと関連情報
COVID-19 研究・対策に活用可能な NVIDIA ソフトウェアと関連情報NVIDIA Japan
 
Jetson Xavier NX クラウドネイティブをエッジに
Jetson Xavier NX クラウドネイティブをエッジにJetson Xavier NX クラウドネイティブをエッジに
Jetson Xavier NX クラウドネイティブをエッジにNVIDIA Japan
 
GTC 2020 発表内容まとめ
GTC 2020 発表内容まとめGTC 2020 発表内容まとめ
GTC 2020 発表内容まとめNVIDIA Japan
 

Mehr von NVIDIA Japan (20)

HPC 的に H100 は魅力的な GPU なのか?
HPC 的に H100 は魅力的な GPU なのか?HPC 的に H100 は魅力的な GPU なのか?
HPC 的に H100 は魅力的な GPU なのか?
 
NVIDIA cuQuantum SDK による量子回路シミュレーターの高速化
NVIDIA cuQuantum SDK による量子回路シミュレーターの高速化NVIDIA cuQuantum SDK による量子回路シミュレーターの高速化
NVIDIA cuQuantum SDK による量子回路シミュレーターの高速化
 
Physics-ML のためのフレームワーク NVIDIA Modulus 最新事情
Physics-ML のためのフレームワーク NVIDIA Modulus 最新事情Physics-ML のためのフレームワーク NVIDIA Modulus 最新事情
Physics-ML のためのフレームワーク NVIDIA Modulus 最新事情
 
20221021_JP5.0.2-Webinar-JP_Final.pdf
20221021_JP5.0.2-Webinar-JP_Final.pdf20221021_JP5.0.2-Webinar-JP_Final.pdf
20221021_JP5.0.2-Webinar-JP_Final.pdf
 
開発者が語る NVIDIA cuQuantum SDK
開発者が語る NVIDIA cuQuantum SDK開発者が語る NVIDIA cuQuantum SDK
開発者が語る NVIDIA cuQuantum SDK
 
NVIDIA Modulus: Physics ML 開発のためのフレームワーク
NVIDIA Modulus: Physics ML 開発のためのフレームワークNVIDIA Modulus: Physics ML 開発のためのフレームワーク
NVIDIA Modulus: Physics ML 開発のためのフレームワーク
 
NVIDIA HPC ソフトウエア斜め読み
NVIDIA HPC ソフトウエア斜め読みNVIDIA HPC ソフトウエア斜め読み
NVIDIA HPC ソフトウエア斜め読み
 
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 アーキテクチャで、変わること、変わらないこと
 
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 発表内容まとめ
 

20190625 OpenACC 講習会 第2部

  • 1. 第2部 – OpenACC によるデータ移動の管理 Naruhiko Tan, Solution Architect, NVIDIA OPENACC 講習会
  • 3. 第2部のアウトライン カバーするトピック § CPU と GPU メモリ § CUDA Unified (Managed) Memory § OpenACC データ管理
  • 5. OPENACC による開発サイクル 分析 並列化最適化 § 分析 - コードを分析し、並列化や最適 化が必要と思われる箇所を⾒出す。 § 並列化 - 最も処理に時間がかかる箇所 からコードの並列化を⾏う。計算結果が正 しいことも確認する。 § 最適化 – 並列化によって得られた性能 から、さらなる⾼速化を図る。
  • 6. OpenACC ディレクティブ データ移動の 管理 並列実⾏の 開始 ループ マッピングの 最適化 #pragma acc data copyin(a,b) copyout(c) { ... #pragma acc parallel { #pragma acc loop gang vector for (i = 0; i < n; ++i) { c[i] = a[i] + b[i]; ... } } ... } CPU, GPU, Manycore 移植性 相互操作可能 1つのソース コード 段階的
  • 7. OpenACC ディレクティブ 第2部︓ データ移動の 管理 第1部︓ 並列実⾏の 開始 #pragma acc data copyin(a,b) copyout(c) { ... #pragma acc parallel { #pragma acc loop gang vector for (i = 0; i < n; ++i) { c[i] = a[i] + b[i]; ... } } ... } CPU, GPU, Manycore 移植性 相互操作可能 1つのソース コード 段階的 第3部︓ ループマッピン グの最適化
  • 8. while ( err > tol && iter < iter_max ) { err=0.0; #pragma acc parallel loop reduction(max:err) for( int j = 1; j < n-1; j++) { for( int i = 1; i < m-1; i++ ) { Anew[OFFSET(j, i, m)] = 0.25 * ( A[OFFSET(j, i+1, m)] + A[OFFSET(j, i-1, m)] + A[OFFSET(j-1, i, m)] + A[OFFSET(j+1, i, m)]); error = fmax( error, fabs(Anew[OFFSET(j, i, m)] - A[OFFSET(j, i , m)])); } } #pragma acc parallel loop for( int j = 1; j < n-1; j++) { for( int i = 1; i < m-1; i++ ) { A[OFFSET(j, i, m)] = Anew[OFFSET(j, i, m)]; } } iter++; } OPENACC PARALLEL LOOP による並列化 8 最初のループを並列化 max reduction を指定 2つ⽬のループを並列化 どのループを並列化するかのみを指⽰し、 どのように並列化するかの詳細は指⽰ していない。
  • 9. OPENACC による⾼速化 1.00X 3.05X 10.18X 37.14X 0.00X 5.00X 10.00X 15.00X 20.00X 25.00X 30.00X 35.00X 40.00X SERIAL MULTICORE NVIDIA TESLA K80 NVIDIA TESLA V100 Speed-Up Speed-up PGI 18.7, NVIDIA Tesla V100, Intel i9-7900X CPU @ 3.30GHz
  • 10. CPU と GPU メモリ
  • 11. CPU + GPU 構成図 § 容量は CPU メモリの⽅が⼤きく、バンド幅は GPU メ モリの⽅が広い。 § CPU と GPU のメモリはそれぞれ独⽴しており、何らか の I/O バスによって接続されている (伝統的には PCI-e が⽤いられる)。 § CPU – GPU 間で転送されるあらゆるデータは、I/O バ スを通して⾏われる。 § GPU のメモリバンド幅に⽐べて、I/O バスは遅い。 § GPU メモリ上にデータがない限り、GPU は計算を⾏う ことができない。 High Capacity Memory Shared Cache High Bandwidth Memory Shared Cache $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ IO Bus GPUCPU
  • 13. 開発者の労⼒を軽減 Without Managed Memory With Managed Memory Managed Memoryシステム メモリ GPU メモリ “Managed memory” とも呼ばれる CUDA UNIFIED MEMORY CPU と GPU のメモリが 1つの共有メモリ空間として統合
  • 14. CUDA MANAGED MEMORY § 明⽰的にホスト-デバイス (CPU-GPU) 間のデータ転送を取り扱うのは、難しい場合がある。 § CUDA Managed Memory を活⽤することにより、データ管理を PGI コンパイラに任せることができ る。 § これにより、開発者はデータ管理については最適化としてとらえて、まずは並列化に集中することが できる。 有⽤性 $ pgcc –fast –acc –ta=tesla:managed –Minfo=accel main.c $ pgfortran –fast –acc –ta=tesla:managed –Minfo=accel main.f90
  • 15. MANAGED MEMORY § ほぼ全ての場合において、⼿動でデータ転送を⾏うこと で、より良いパフォーマンスを得ることができる。 § メモリの確保/開放は、managed memory を⽤いた ⽅がより時間がかかる。 § データ転送を⾮同期で⾏うことはできない。 § 今現在、PGI コンパイラと NVIDIA GPU の組み合わせ でのみ利⽤可能。 制限事項 With Managed Memory Managed Memory
  • 17. 第1部では UNIFIED MEMORY を利⽤ Why? § PGI と NVIDIA GPU への依存を排除。 § 現状のコードでは、データは “少し遅い” タイミングで GPU に到着しているので、改善してみましょ う。 Unified Memory なしでコードを実⾏してみましょう
  • 19. 基本的なデータ管理 § ホストは CPU。 § デバイスは何らかのアクセラレータ。 § ターゲット ハードウェアがマルチ コアCPUの場合、ホ ストとデバイスは同⼀となる。つまり、メモリも同⼀と なる。 § マルチ コアのように、メモリ空間が共有されたアクセ ラレータを使う場合は、明⽰的なデータ管理の必要 はない。 ホスト - デバイス間 Host Device Host Memory Device Memory
  • 20. 基本的なデータ管理 § ターゲット ハードウェアが GPU の場合、CPU-GPU 間でのデータ転送が必要となる。 § GPU で使われる配列は、GPU 上でメモリ確保され ていなければならない。 § CPU か GPU 上のデータが更新された場合、もう⼀ ⽅のデータも更新しなければならない。 ホスト – デバイス間 High Capacity Memory Shared Cache High Bandwidth Memory Shared Cache $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ IO Bus GPUCPU
  • 21. “MANAGED” オプションなしでビルド pgcc -ta=tesla -Minfo=accel laplace2d.c jacobi.c laplace2d.c: PGC-S-0155-Compiler failed to translate accelerator region (see -Minfo messages): Could not find allocated-variable index for symbol (laplace2d.c: 47) calcNext: 47, Accelerator kernel generated Generating Tesla code 48, #pragma acc loop gang /* blockIdx.x */ Generating reduction(max:error) 50, #pragma acc loop vector(128) /* threadIdx.x */ 48, Accelerator restriction: size of the GPU copy of Anew,A is unknown 50, Loop is parallelizable PGC-F-0704-Compilation aborted due to previous errors. (laplace2d.c) PGC/x86-64 Linux 18.7-0: compilation aborted jacobi.c: –ta=tesla:managed から “managed” を削除
  • 23. DATA クローズ copy ( list ) GPU 上にメモリを確保し、データ領域に⼊る際に、ホストから GPU にデータを コピーし、データ領域から出る際に、GPU からホストにデータをコピー。 主な使⽤例: GPU へのインプットとなり、かつ上書きされ、ホストに返される 様々なデータについては、これがデフォルト。 copyin ( list ) GPU 上にメモリを確保し、データ領域に⼊る際に、ホストから GPU にデータを コピー。 主な使⽤例: あるサブルーチンに対するインプット配列とみなせる。 copyout ( list ) GPU 上にメモリを確保し、データ領域から出る際に、GPU からホストにデータを コピー。 主な使⽤例: インプット データを上書きしない計算結果。 create ( list ) GPU 上にメモリを確保するが、データ コピーは⾏わない。 主な使⽤例: ⼀時配列。
  • 24. 配列の整形 § コンパイラが配列の形を理解するのに、プログラマの助けが必要な場合がある。 § 最初の数字は、配列要素の最初のインデックス。 § C/C++ では、2番めの数字は転送される配列の⻑さ。 § Fortran では、2番めの数字は最後のインデックス。 copy(array(starting_index:ending_index)) copy(array[starting_index:length]) C/C++ Fortran
  • 25. 配列の整形 (続き) 多次元配列 copy(array(1:N, 1:M)) copy(array[0:N][0:M]) C/C++ Fortran これらの例は、2次元配列をデバイスにコピーする
  • 27. while ( err > tol && iter < iter_max ) { err=0.0; #pragma acc parallel loop reduction(max:err) copyin(A[0:n*m]) copy(Anew[0:n*m]) for( int j = 1; j < n-1; j++) { for( int i = 1; i < m-1; i++ ) { Anew[OFFSET(j, i, m)] = 0.25 * ( A[OFFSET(j, i+1, m)] + A[OFFSET(j, i-1, m)] + A[OFFSET(j-1, i, m)] + A[OFFSET(j+1, i, m)]); error = fmax( error, fabs(Anew[OFFSET(j, i, m)] - A[OFFSET(j, i , m)])); } } #pragma acc parallel loop copyin(Anew[0:n*m]) copyout(A[0:n*m]) for( int j = 1; j < n-1; j++) { for( int i = 1; i < m-1; i++ ) { A[OFFSET(j, i, m)] = Anew[OFFSET(j, i, m)]; } } iter++; } 最適化されたデータ転送 データ クローズで配列 形状を指定
  • 28. “MANAGED” オプションなしでビルド pgcc -ta=tesla -Minfo=accel laplace2d.c jacobi.c laplace2d.c: calcNext: 47, Generating copyin(A[:m*n]) Accelerator kernel generated Generating Tesla code 48, #pragma acc loop gang /* blockIdx.x */ Generating reduction(max:error) 50, #pragma acc loop vector(128) /* threadIdx.x */ 47, Generating implicit copy(error) Generating copy(Anew[:m*n]) 50, Loop is parallelizable swap: 62, Generating copyin(Anew[:m*n]) Generating copyout(A[:m*n]) Accelerator kernel generated Generating Tesla code 63, #pragma acc loop gang /* blockIdx.x */ 65, #pragma acc loop vector(128) /* threadIdx.x */ 65, Loop is parallelizable jacobi.c: –ta=tesla:managed から “managed” を削除
  • 29. OPENACC による ⾼速化 低速化︖ 1.00X 3.23X 41.80X 0.33X 0.00X 5.00X 10.00X 15.00X 20.00X 25.00X 30.00X 35.00X 40.00X 45.00X SERIAL MULTICORE V100 V100 (DATA CLAUSES) Speed-Up Speed-up
  • 30. 問題は何か︖ § Magaged memory オプションなしでビルドするのに必要な情報は全て揃っているはずだが、実⾏ 時間が⼤幅に増加。 § ここでプロファイリング ツールが活躍。
  • 33. 実⾏時間のブレークダウン Data Copy H2D Data Copy D2H CalcNext Swap ほとんど全ての時間が ホスト-デバイス間の データ転送に費やされ ている
  • 34. while ( err > tol && iter < iter_max ) { err=0.0; #pragma acc parallel loop reduction(max:err) copyin(A[0:n*m]) copy(Anew[0:n*m]) for( int j = 1; j < n-1; j++) { for( int i = 1; i < m-1; i++ ) { Anew[OFFSET(j, i, m)] = 0.25 * ( A[OFFSET(j, i+1, m)] + A[OFFSET(j, i-1, m)] + A[OFFSET(j-1, i, m)] + A[OFFSET(j+1, i, m)]); error = fmax( error, fabs(Anew[OFFSET(j, i, m)] - A[OFFSET(j, i , m)])); } } #pragma acc parallel loop copyin(Anew[0:n*m]) copyout(A[0:n*m]) for( int j = 1; j < n-1; j++) { for( int i = 1; i < m-1; i++ ) { A[OFFSET(j, i, m)] = Anew[OFFSET(j, i, m)]; } } iter++; } 最適化されたデータ転送 while ループのイタレー ションごとにデータをコ ピーしているが、それら を再利⽤可能︖
  • 36. OPENACC DATA ディレクティブ § data ディレクティブは、個々のループをま たいで、データがデバイスに存在するライフ タイムを定義する。 § データ領域中は、デバイスがデータを所有 している。 § data クローズは、データ領域でのデータ 転送と形状を表現する。 定義 #pragma acc data clauses { < Sequential and/or Parallel code > } !$acc data clauses < Sequential and/or Parallel code > !$acc end data
  • 37. STRUCTURED DATA ディレクティブ 使⽤例 #pragma acc data copyin(a[0:N],b[0:N]) copyout(c[0:N]) { #pragma acc parallel loop for(int i = 0; i < N; i++){ c[i] = a[i] + b[i]; } } 動作 ホスト メモリ デバイス メモリ A B C デバイス上に A の メモリ領域を確保 A を CPU からデ バイスにコピー A デバイス上に B の メモリ領域を確保 B を CPU から デバイスにコピー B デバイス上に C の メモリ領域を確保 デバイス上で ループを実⾏ C’ C をデバイスから CPU へコピー C’ デバイス上の C を解放 デバイス上の B を解放 デバイス上の A を解放
  • 38. #pragma acc data copy(A[0:n*m]) copyin(Anew[0:n*m]) while ( err > tol && iter < iter_max ) { err=0.0; #pragma acc parallel loop reduction(max:err) copyin(A[0:n*m]) copy(Anew[0:n*m]) for( int j = 1; j < n-1; j++) { for( int i = 1; i < m-1; i++ ) { Anew[OFFSET(j, i, m)] = 0.25 * ( A[OFFSET(j, i+1, m)] + A[OFFSET(j, i-1, m)] + A[OFFSET(j-1, i, m)] + A[OFFSET(j+1, i, m)]); error = fmax( error, fabs(Anew[OFFSET(j, i, m)] - A[OFFSET(j, i , m)])); } } #pragma acc parallel loop copyin(Anew[0:n*m]) copyout(A[0:n*m]) for( int j = 1; j < n-1; j++) { for( int i = 1; i < m-1; i++ ) { A[OFFSET(j, i, m)] = Anew[OFFSET(j, i, m)]; } } iter++; } 最適化されたデータ転送 必要な時のみ A をコピー。 Anew の初期条件はコピーす るが、最終的な値はしない。
  • 39. コードを再度ビルド pgcc -fast -ta=tesla -Minfo=accel laplace2d_uvm.c main: 60, Generating copy(A[:m*n]) Generating copyin(Anew[:m*n]) 64, Accelerator kernel generated Generating Tesla code 64, Generating reduction(max:error) 65, #pragma acc loop gang /* blockIdx.x */ 67, #pragma acc loop vector(128) /* threadIdx.x */ 67, Loop is parallelizable 75, Accelerator kernel generated Generating Tesla code 76, #pragma acc loop gang /* blockIdx.x */ 78, #pragma acc loop vector(128) /* threadIdx.x */ 78, Loop is parallelizable データ転送はデータ領域で のみ発生。
  • 41. これまでに学んだこと § CUDA Unified (Managed) Memory はポーティングのための強⼒なツール。 § Managed memory を活⽤せずに GPU プログラミングを⾏う場合は、データ転送に際して配列の 形状を指定する必要がある。 § 各ループごとにデータ転送を⾏うのは、概して⾮効率。 § OpenACC data 領域によって、データ転送と計算を別々に管理することができる。
  • 43. update: ホストとデバイス間でデータを明⽰的に転送する データ領域の途中でデータを同期したい場合に有効 クローズ: self: ホスト側のデータをデバイス側のデータと⼀致させる device: デバイス側のデータをホスト側のデータと⼀致させる #pragma acc update self(x[0:count]) #pragma acc update device(x[0:count]) !$acc update self(x(1:end_index)) !$acc update device(x(1:end_index)) Fortran C/C++ OPENACC UPDATE ディレクティブ
  • 44. BB* A*A OPENACC UPDATE ディレクティブ A CPU Memory device Memory #pragma acc update device(A[0:N]) B* #pragma acc update self(B[0:N]) update ディレクティブが動作 するためには、CPU とデバイ ス両⽅にデータが存在してい る必要がある。
  • 45. UPDATE でデータ同期 int* A=(int*) malloc(N*sizeof(int)) #pragma acc data create(A[0:N]) while( timesteps++ < numSteps ) { #pragma acc parallel loop for(int i = 0; i < N; i++){ a[i] *= 2; } if (timestep % 100 ) { #pragma acc update self(A[0:N]) checkpointAToFile(A, N); } } § データ領域中で、ホストあるいはデバイス側のデー タが上書きされる時がある。 § データ領域を終了し、再度新しいデータ領域を開 始するのはコストがかかる。 § 代わりに、ホストとデバイス側のデータが同⼀となる よう更新。 § 例︓ファイル I/O、通信、etc…
  • 47. ⾮構造 DATA ディレクティブ § データのライフタイムは、必ずしもきれいに構造 化されているとは限らない。 § Enter data ディレクティブはデバイスのメモリ 確保を処理する。 § メモリ確保のために、create か copyin のど ちらかを使うことができる。 § 複数の enter data ディレクティブを挿⼊する ことができるので、その enter data ディレク ティブが、data 領域の開始とは限らない。 Enter Data ディレクティブ #pragma acc enter data clauses < Sequential and/or Parallel code > #pragma acc exit data clauses !$acc enter data clauses < Sequential and/or Parallel code > !$acc exit data clauses
  • 48. ⾮構造 DATA ディレクティブ § Exit data では、デバイスのメモリ解放を処理 する。 § メモリ解放のために、delete か copyout のど ちらかを使うことができる。 § ある配列に対して、enter data の数だけ exit data を挿⼊する。 § これらは、別々の関数に挿⼊することができる。 Exit Data ディレクティブ #pragma acc enter data clauses < Sequential and/or Parallel code > #pragma acc exit data clauses !$acc enter data clauses < Sequential and/or Parallel code > !$acc exit data clauses
  • 49. ⾮構造 DATA クローズ copyin ( list ) enter data に際し、デバイス上にメモリを確保し、ホストからデバイスへデータ をコピー。 copyout ( list ) exit data に際し、デバイスからホストへデータをコピーし、デバイス上のメモリ を解放。 create ( list ) enter data に際し、データ転送なしでデバイス上にメモリを確保。 delete ( list ) exit data に際し、データ転送なしでデバイス上のメモリを解放。
  • 50. ⾮構造 DATA ディレクティブ 基本的な例 #pragma acc parallel loop for(int i = 0; i < N; i++){ c[i] = a[i] + b[i]; }
  • 51. ⾮構造 DATA ディレクティブ 基本的な例 #pragma acc enter data copyin(a[0:N],b[0:N]) create(c[0:N]) #pragma acc parallel loop for(int i = 0; i < N; i++){ c[i] = a[i] + b[i]; } #pragma acc exit data copyout(c[0:N]) delete(a,b)
  • 52. ⾮構造 VS. 構造 簡単なコードを例に #pragma acc enter data copyin(a[0:N],b[0:N]) create(c[0:N]) #pragma acc parallel loop for(int i = 0; i < N; i++){ c[i] = a[i] + b[i]; } #pragma acc exit data copyout(c[0:N]) delete(a,b) #pragma acc data copyin(a[0:N],b[0:N]) copyout(c[0:N]) { #pragma acc parallel loop for(int i = 0; i < N; i++){ c[i] = a[i] + b[i]; } } ⾮構造 構造 § 複数の開始/終了ポイントを持ち得る。 § 異なる関数にまたがることができる。 § 解放されるまではメモリは確保されたまま。 § 明⽰的に開始/終了ポイントが必要。 § 1つの関数内に収まる必要がある。 § メモリはデータ領域中のみ確保される。
  • 53. ⾮構造 DATA ディレクティブ 複数の関数をまたいでの利⽤ int* allocate_array(int N){ int* ptr = (int *) malloc(N * sizeof(int)); #pragma acc enter data create(ptr[0:N]) return ptr; } void deallocate_array(int* ptr){ #pragma acc exit data delete(ptr) free(ptr); } int main(){ int* a = allocate_array(100); #pragma acc kernels { a[0] = 0; } deallocate_array(a); } § この例では、enter data と exit data がそれぞれ 異なる関数で宣⾔されている。 § プログラマはデバイス メモリの確保/解放をホスト メ モリのそれと対応させることができる。 § C++ のような、構造化スコープの設定が難しい場 合に特に有効。
  • 55. typedef struct { float x, y, z; } float3; int main(int argc, char* argv[]){ int N = 10; float3* f3 = malloc(N * sizeof(float3)); #pragma acc enter data create(f3[0:N]) #pragma acc kernels for(int i = 0; i < N; i++){ f3[i].x = 0.0f; f3[i].y = 0.0f; f3[i].z = 0.0f; } #pragma acc exit data delete(f3) free(f3); } C 構造体 動的なメンバなしの場合 § 動的なメンバとは、動的にメモリ確保される配 列のような、構造体内の可変サイズを持つメ ンバのこと。 § Float3 構造体のメンバは全て固定⻑の変数 なので、OpenACC はこの構造体をデバイス メモリにコピーすることができる。 § 動的にメモリが確保される配列が構造体に含 まれていたらどうなるか︖
  • 56. C 構造体 動的なメンバを含む場合 typedef struct { float *arr; int n; } vector; int main(int argc, char* argv[]){ vector v; v.n = 10; v.arr = (float*) malloc(v.n*sizeof(float)); #pragma acc enter data copyin(v) #pragma acc enter data create(v.arr[0:v.n]) ... #pragma acc exit data delete(v.arr) #pragma acc exit data delete(v) free(v.arr); } § OpenACC は構造体とその動的メンバをコ ピーするのに⼗分な情報を与えられていない。 § まず最初に構造体をデバイス メモリにコピーし、 その後に動的メンバのメモリを確保、あるいは コピーする。 § メモリ解放時は、動的メンバ、構造体の順に 処理する。 § OpenACC は動的メンバを⾃動的に構造体 にアタッチする。
  • 58. キー コンセプト この講義で学んだこと… § CPU と GPU の違いと、Unified Memory。 § OpenACC 配列の整形。 § OpenACC Data クローズ。 § OpenACC 構造 Data 領域。 § OpenACC Update ディレクティブ。 § OpenACC ⾮構造 Data ディレクティブ。