一般社団法人電子情報通信学会 THE INSTITUTE OF ELECTRONICS, INFORMATION AND COMMUNICATION ENGINEERS 信学技報 IEICE Technical Report A P (2014-6) FDTD 法の並列化技術とオープンソ

Similar documents
EEM-FDM 電磁界シミュレータ 〇差分法を用いた電磁界シミュレータ 時間領域差分法 (FDTD 法 ) : 高周波用 ( 計算対象 > 波長 ) 周波数領域差分法 : 低周波用 ( 計算対象 < 波長 ) 〇用途 準静電界 (10 3 Hz) から光 (10 15 Hz) まであらゆる電磁界現象

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

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

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

! 行行 CPUDSP PPESPECell/B.E. CPUGPU 行行 SIMD [SSE, AltiVec] 用 HPC CPUDSP PPESPE (Cell/B.E.) SPE CPUGPU GPU CPU DSP DSP PPE SPE SPE CPU DSP SPE 2

EnSightのご紹介

Microsoft Word ●IntelクアッドコアCPUでのベンチマーク_吉岡_ _更新__ doc

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

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

GPGPU

N08

Microsoft PowerPoint - 演習1:並列化と評価.pptx

スライド 1

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

GPU.....

2ndD3.eps

研究報告用MS-Wordテンプレートファイル

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

( CUDA CUDA CUDA CUDA ( NVIDIA CUDA I

Microsoft PowerPoint - OpenMP入門.pptx

Slide 1

Microsoft PowerPoint - GPUシンポジウム _d公開版.ppt [互換モード]

23 Fig. 2: hwmodulev2 3. Reconfigurable HPC 3.1 hw/sw hw/sw hw/sw FPGA PC FPGA PC FPGA HPC FPGA FPGA hw/sw hw/sw hw- Module FPGA hwmodule hw/sw FPGA h

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

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

IntelR Compilers Professional Editions


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

1. マシンビジョンにおける GPU の活用

HPC143

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

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

研究背景 大規模な演算を行うためには 分散メモリ型システムの利用が必須 Message Passing Interface MPI 並列プログラムの大半はMPIを利用 様々な実装 OpenMPI, MPICH, MVAPICH, MPI.NET プログラミングコストが高いため 生産性が悪い 新しい並

プログラミング実習I

Microsoft PowerPoint - 1_コンパイラ入門セミナー.ppt

GPGPUクラスタの性能評価

NUMAの構成

PowerPoint プレゼンテーション

NUMAの構成

本文ALL.indd

Slide 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

s ss s ss = ε = = s ss s (3) と表される s の要素における s s = κ = κ, =,, (4) jωε jω s は複素比誘電率に相当する物理量であり ここで PML 媒質定数を次のように定義する すなわち κξ をPML 媒質の等価比誘電率 ξ をPML 媒質の

main.dvi

演算増幅器

PowerPoint プレゼンテーション

GPU CUDA CUDA 2010/06/28 1

<4D F736F F D20332E322E332E819C97AC91CC89F090CD82A982E78CA982E9466F E393082CC8D5C91A291CC90AB945C955D89BF5F8D8296D85F F8D F5F E646F63>

NUMAの構成

プログラミングI第10回

PowerPoint プレゼンテーション

GPUコンピューティング講習会パート1

1 GPU GPGPU GPU CPU 2 GPU 2007 NVIDIA GPGPU CUDA[3] GPGPU CUDA GPGPU CUDA GPGPU GPU GPU GPU Graphics Processing Unit LSI LSI CPU ( ) DRAM GPU LSI GPU

Windows 版 GAMESS インストールマニュアル 2019/6/5 [64bit Windows の場合 ] [32bit Windows の場合 ] [64bit Windows の場合 ] 1. GAMESS のサイト内の [GAMESS User License Agreement]

MPI または CUDA を用いた将棋評価関数学習プログラムの並列化 2009/06/30

並列・高速化を実現するための 高速化サービスの概要と事例紹介

Microsoft PowerPoint - 計算機言語 第7回.ppt

自己紹介 湯浅陽一 1999 年より Linux kernel 開発に参加 MIPS アーキテクチャのいくつかの CPU へ Linux kernel を移植

PowerPoint プレゼンテーション

高性能計算研究室の紹介 High Performance Computing Lab.

PowerPoint プレゼンテーション

GPUを用いたN体計算

コードのチューニング

7 ポインタ (P.61) ポインタを使うと, メモリ上のデータを直接操作することができる. 例えばデータの変更 やコピーなどが簡単にできる. また処理が高速になる. 7.1 ポインタの概念 変数を次のように宣言すると, int num; メモリにその領域が確保される. 仮にその開始のアドレスを 1

PowerPoint プレゼンテーション

PowerPoint Presentation

Pervasive PSQL v11 のベンチマーク パフォーマンスの結果

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

ビッグデータ分析を高速化する 分散処理技術を開発 日本電気株式会社

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

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

Microsoft PowerPoint - compsys2-06.ppt

目的と目次 OpenCL はこれからのマルチコアプログラミングの主流 ( かも ) GPU (NVIDIA, AMD/ATI) Cell B.E. 組み込みプロセッサ 共通コードとして OpenCL に対応するために必要な準備を考える 目次 基礎編 ( 今回 ) OpenCL とは 実践編 高速化の

04-process_thread_2.ppt

Microsoft PowerPoint - 09.pptx

Prog1_10th

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

Social Intelligence []... [] ( ) ( ) 一 般 の 情 報 他 人 の 情 報 人 コンテキスト 付 与 ソーシャル メディアの 普 及 により 受 け 手 は 自 分 の 認 識 を 発 信 機 械 コンテキスト 分 析 私 の 情 報 神 沼 靖 子, 内 木

最新の並列計算事情とCAE

スライド 1

untitled

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

TopSE並行システム はじめに

コマンドラインから受け取った文字列の大文字と小文字を変換するプログラムを作成せよ 入力は 1 バイトの表示文字とし アルファベット文字以外は変換しない 1. #include <stdio.h> 2. #include <ctype.h> /*troupper,islower,isupper,tol

C#の基本

MATLAB® における並列・分散コンピューティング ~ Parallel Computing Toolbox™ & MATLAB Distributed Computing Server™ ~

ERDAS IMAGINE における処理速度の向上 株式会社ベストシステムズ PASCO CORPORATION 2015

インテル(R) Visual Fortran コンパイラ 10.0

Microsoft PowerPoint - 10.pptx

VXPRO R1400® ご提案資料

並列計算導入.pptx

Touch Panel Settings Tool

(2) 構造体変数の宣言 文法は次のとおり. struct 構造体タグ名構造体変数名 ; (1) と (2) は同時に行える. struct 構造体タグ名 { データ型変数 1; データ型変数 2;... 構造体変数名 ; 例 : struct STUDENT{ stdata; int id; do

<4D F736F F F696E74202D2091E63489F15F436F6D C982E682E992B48D8291AC92B489B F090CD2888F38DFC E B8CDD8

Microsoft PowerPoint - OS07.pptx

fse7_time_sample

memo

Insert your Title here

SuperH RISC engineファミリ用 C/C++コンパイラパッケージ V.7~V.9 ご使用上のお願い

slide5.pptx

Transcription:

一般社団法人電子情報通信学会 THE INSTITUTE OF ELECTRONICS, INFORMATION AND COMMUNICATION ENGINEERS 信学技報 IEICE Technical Report A P204-4(204-6) FDTD 法の並列化技術とオープンソース化 大賀明夫株式会社 EEM E-mail: oga@e-em.co.jp あらまし FDTD 法の各種並列化技術について説明し実装する 並列化技術として OpenMP マルチスレッド MPI CUDA OpenCL を取り上げる プログラムはオープンソースとして公開する キーワード FDTD 法, 並列化 OpenMP MPI CUDA OpenCL Parallelization of FDTD and its open source program Akio OGA EEM Inc. E-mail: oga@e-em.co.jp Abstract Several techniques parallelizing FDTD are presented. They include OpenMP, Multi-threading, MPI, CUDA and OpenCL. Programs are opened with source code. Keyword FDTD, Parallelization, OpenMP, MPI, CUDA, OpenCL. はじめに FDTD(Finite Difference Time Domain) 法を用いた電磁界シミュレータは電磁界の各種の用途に広く用いられている しかし問題の規模が大きくなりまた形状が複雑化すると計算時間が長くなり その高速化が求められている 本報告では高速化のために技術として並列化を取り上げる 各種手法の並列プログラムの実例を挙げ プログラミング上の注意点や効率的な開発方法について述べる 最後にベンチマーク問題の計算時間を計測し各手法について考察する プログラムは OpenFDTD という名前のオープンソースとして公開する [] チ CPU のコンピュータで並列計算するときに使用する この環境を共有メモリーと呼ぶ (2) マルチスレッド [3] これは共有メモリー環境で複数のスレッドを生成し 計算処理を各スレッドに分割するものである ユーザーはスレッド関数を起動しスレッド番号に応じた処理を記述する マルチスレッドは OS とコンパイラが標準でサポートしている () と比べてプログラミングの作業量は増えるが細かい並列処理にも対応できる () もマルチスレッドの一種であるがプログラミング手法が異なるのでここでは別に扱う (3) MPI (Message Passing Interface) [4]-[7] これは複数台のコンピュータで並列計算するものである 2. 並列化技術並列化の技術としては以下の手法がある () OpenMP [2] これはプログラムの for 文の前に固有のディレクティブ ( 指示文 ) を記入し コンパイラがその指示文をもとに並列プログラムを作成するものである 現在のほとんどの C/C++ コンパイラは OpenMP をサポートしている 台のマルチコア マル この環境を分散メモリーと呼ぶ マルチコア マルチ CPU による並列計算も含んでいる 処理の単位はプロセスとなりメモリー空間が独立しているので プロセス間のデータのやりとりは MPI の関数を呼び出すことによって通信により行う (4) CUDA [8]-[0] これは NVIDIA のグラフィックスボードの高い計算能力を汎用の科学技術計算に用いるものである (GPGPU : General- This article is a technical report without peer review, and its polished and/or extended version may be published elsewhere. Copyright 204 by IEICE

Purpose computing on Graphics Processing Units) 計算処理を多 数のスレッドに分割して並列計算を行う CPU と GPU 間は関 ここで c, c 2, d, d 2 は次式で計算される無次元量である 数を通してメモリー転送を行う (5) OpenCL []-[6] これは NVIDIA または AMD のグラフィックスボードを用いて並列計算を行うものである プログラミング手法は CUDA とほぼ同じであるが 各種のデバイスで動作することが特長である 3. FDTD 法 Maxwell 方程式に構成方程式を代入して係数の次元を揃え c = } +(ησ)c Δ t c 2 = +(ησ)c Δ t d = d 2 = μ r μ r +( σ m η )c Δ t μ r +( σ m η )c Δt } (5) (6) ると式 ()(2) となる E = η H (ησ) E () c t μ r η H c t ここで E : 電界 磁率 = E ( σ m η )η H (2) σ : 導電率 σ m : 導磁率 ンピーダンス c= ϵ 0 μ 0 H : 磁界 : 比誘電率 μ r : 比透 η= μ 0 ϵ 0 : 真空の光速である : 真空の波動イ 式 ()(2) を時間的に離散化すると次式が得られる 右上の n は時間ステップである E n+ =c E n +c 2 (c Δ t) η H n+ 2 η H n+ 2 =d η H n 2 d 2 (c Δ t) E n (4) (3) 式 (3) の X 成分を図 の Yee 格子で空間的に離散化すると 次式が得られる [7] E n+( i+ x 2 ) (, j, k =c i+ 2 ) (, j, k E n x i+, j, 2 k) n+ +c 2( i+ H z 2( 2 ){η i+, j, k 2, j+ 2 ), k η H n+ z 2( i+ 2, j 2 ), k Δ y j /(c Δt) n + η H y 2( i+ 2, j,k + 2) ηh n+ y 2( i+ 2 2), j, k } Δ z k /(c Δt) (i=0,, N x, j=0,, N y, k =0,, N z ) (7) 適当な波源のもとで式 (7) とその他の成分を反復計算すること によって電磁界の時間波形が求まり それを Fourier 変換する ことにより周波数領域の電磁界が得られる 4. FDTD 法プログラム 電界の X 成分を更新する式 (7) のプログラムは以下のよう になる 表 Ex 成分を更新するプログラム #define NA(i,j,k) ((i)*ni+(j)*nj+(k)*nk+n0) Hx 単位セル 2 void updateex(void) { 3 int i, j, k; Z Y Ez (i,j,k) Hy Ey Hz 4 size_t n; 5 for (i = 0; i < Nx; i++) { 6 for (j = 0; j <= Ny; j++) { X Ex 図 Yee 格子 7 for (k = 0; k <= Nz; k++) { 8 n = NA(i, j, k); 9 Ex[n] = C[iEx[n]] * Ex[n] 0 + C2[iEx[n]] * (RYn[j] * (Hz[n] - Hz[n - Nj]) - RZn[k] * (Hy[n] - Hy[n - Nk])); 2

2 } 3 } 4 } 5 } ループは外側から i,j,k の順にとる 従って電磁界配列のアドレスも外側から i,j,k の順に配置する必要がある 係数 (C,C2) は物性値番号を通して間接的に参照する 物性値の種類を 256 個までに限定すると バイトで表せる このとき全体の必要メモリーは 30NxNyNz バイトになる 表 では左辺の変数への書き込みがループ間で競合しないために 3 重ループはどのように並べ替えても結果が変わらない この性質のために FDTD 法は極めて並列計算向きのアルゴリズムになっている 5. OpenMP OpenMP では並列化可能な for 文の直前に指示文 (#pragma omp で始まる ) を代入し コンパイラの自動並列化機能を利用する 表 2 に表 を OpenMP 対応にしたプログラムを示す 違いは 4 行目のみである ここで private は括弧内の変数を各スレッドで独自に持ちスレッド間で共有しないことを示す なお 並列化するループは 3 つのうちどれでもよいが一番粒度 ( 単位スレッドの計算量 ) の大きい外側のループが最も効率がよい このように FDTD 法は OpenMP を用いると簡単に並列化することができる 表 2 Ex 成分を更新するプログラム (OpenMP 版 ) void updateex(void) { 2 int i, j, k; 3 size_t n; 4 #pragma omp parallel for private(i,j,k,n) 5 for (i = 0; i < Nx; i++) { 6 for (j = 0; j <= Ny; j++) { 7 for (k = 0; k <= Nz; k++) { 8 n = NA(i, j, k); 9 Ex[n] = C[iEx[n]] * Ex[n] 0 + C2[iEx[n]] * (RYn[j] * (Hz[n] - Hz[n - Nj]) 5 } 6. マルチスレッド 表 3 にマルチスレッドのプログラムを示す ループの中は 表 と同じであり省略する スレッド関数には void* 型の引数 を つ指定することができる スレッド番号以外の変数を渡 すには構造体に入れるかグローバル変数を使用する スレッ ドを起動 / 終了する関数は Windows では CreateThread / WaitForMultipleObjects Linux では pthread_create / pthread_join である 表 3 Ex 成分を更新するプログラム ( マルチスレッド版 ) typedef struct { 2 int tid; 3 } update_arg_t; 4 void updateex_thread(void *arg) { 5 update_arg_t *targ = (update_arg_t *)arg; 6 int tid = targ->tid; 7 int i, j, k; 8 size_t n; 9 int nu, i0, i; 0 nu = ((Nx + 0) + (nthread - )) / nthread; i0 = tid * nu; 2 i = MIN(i0 + nu, Nx + 0); 3 for (i = i0; i < i; i++) { 4 for (j = 0; j <= Ny; j++) { 5 for (k = 0; k <= Nz; k++) { スレッド 0 スレッド スレッド 2 0 2 3 4 5 6 7 8 9 ()block 型スレッド 2 スレッド スレッド 0 0 2 3 4 5 6 7 8 9 (2)cyclic 型 図 2 2 種類のループ分割法 ( ループ長 =0, スレッド数 =3 ) - RZn[k] * (Hy[n] - Hy[n - Nk])); 2 } 3 } 4 } ループを分割するには図 2 の 2 種類があるが 表 3 では他の 並列化に合わせて block 型を用いている cyclic 型にするには 9-3 行目が以下の一行になる 3

for (i = tid; i < Nx; i += nthread) { ここで変数 tid はスレッド番号 nthread はスレッド数である なお 0 行目は繰り上げ商を計算するものであり並列計算でよく用いられる定型句である 7. MPI ここでは計算領域を X 方向に分割する 各プロセスの i の下限と上限を imin,imax とすると表 の 5 行目が以下に変わるだけである for (i = imin; i < imax; i++) { 計算領域がプロセスに分割されるのでプロセス数を増やせば計算できるサイズに上限はない タイムステップごとに図 3 の通り不足する成分を隣のプロセスから通信により取得する 不足する成分は領域境界の半セル外側の Hy,Hz 成分である 通信には MPI_Sendrecv 関数を用いる 通信量は 8NyNz バイトである なお 領域境界上の Ey,Ez,Hx 成分は両プロセスで重複して持ち重複して計算する 領域境界通信方向 とする このようにすると変数のアドレスの並びはこれまで述べた CPU 版と同じでよい CUDA では CPU/GPU 間のメモリー転送を少なくすることが大切であるが FDTD 法では反復計算の間はすべて GPU メモリー ( デバイスメモリー ) 内で計算できるので都合がよい 表 4 に CUDA プログラムを示す 表 4 Ex 成分を更新するプログラム (CUDA 版 ) device host void updateex( 2 size_t n, size_t nj, size_t nk, 3 float *ex, float *hy, float *hz, 4 float c, float c2, float ryn, float rzn) { 5 ex[n] = c * ex[n] 6 + c2 * (ryn * (hz[n] - hz[n - nj]) 7 - rzn * (hy[n] - hy[n - nk])); 8 } ここでアドレス n は Block,Grid から次式で計算される int i = threadidx.z + (blockidx.z * blockdim.z); int j = threadidx.y + (blockidx.y * blockdim.y); int k = threadidx.x + (blockidx.x * blockdim.x); size_t n = (i * ni) + (j * nj) + (k * nk) + n0; CUDA プログラミングの作業手順は以下のようになる () 逐次版を作成し十分テストする (2) 計算の主要部を CPU/GPU から呼び出せるように書き換える 表 4 の関数修飾子 device host がこれを表している (3) カーネル関数 (GPU で行う処理 ) と CPU/GPU 間のメモリ Y プロセス P プロセス P+ Ey Hy X Hx Ez Hz 図 3 MPI の通信 8. CUDA CUDA では表 の 3 重ループを多数のスレッドに分割し並列計算する ここでは Block=(32,8,)=256 スレッド Grid=(Nz/32,Ny/8,Nx)( 正確には繰り上げ商 ) とする CUDA ではスレッドの順に変数にアクセスすることが必須 (coalescing of memory[0]) であるためにループは外側から i,j,k ー転送を実装する (2) で計算処理を CPU/GPU で共通化することにより (3) の作業が形式的なもので済み作業効率が上がる 9. OpenCL OpenCL のアーキテクチャは CUDA とほぼ同じであるからプログラム設計法は CUDA と同じである 表 5 に OpenCL プログラムを示す 表 5 Ex 成分を更新するプログラム (OpenCL 版 ) #define LA(p,i,j,k) ((i)*((p)->ni)+(j)*((p)->nj)+ (k)*((p)->nk)+((p)->n0)) 2 kernel void updateex( 4

3 constant index_t *p, る 計算条件は以下の通りである 4 global float *ex, global float *hy, global float *hz, global unsigned char *iex, 5 global float *c, global float *c2, global float *ryn, global float *rzn) { 6 int i = get_global_id(2); 7 int j = get_global_id(); 8 int k = get_global_id(0); 9 if ((i < p->nx) && 0 (j <= p->ny) && (k <= p->nz)) { 2 int n = LA(p, i, j, k); 3 ex[n] = c[iex[n]] * ex[n] セル数:200 x 200 x 200 タイムステップ数:2000 周波数:20GHz 吸収境界条件:Mur 一次計算環境は以下の通りである CPU-:Intel Core i7-4770k, 4 コア, 4.0GHz(OC) CPU-2:Intel Core i5-2500k, 4 コア, 4.0GHz(OC) GPU-:NVIDIA GeForce GTX 670, 344 コア, 4GB GPU-2:AMD Radeon R9 270, 280 コア, 2GB OS:Windows7 64 ビット コンパイラ:Microsoft Visual Studio 202 ネットワーク: ギガビットイーサネット 4 + c2[iex[n]] * (ryn[j] * (hz[n] - hz[n - p->nj]) 5 - rzn[k] * (hy[n] - hy[n - p->nk])); 6 } 7 } 以下 OpenCL 固有の注意点を挙げる ()OpenCL はいろいろな環境で動かすためにやや複雑な前処理が必要であるが 定型的な処理なのでモジュール化して計算部と切り離しておく (2) オンラインコンパイルを使用するときはカーネルコードは "Intel Kernel Builder"[2] を用いて文法をチェックしておく カーネルコードでは #include は使えない (#define は可 ) (3)OpenCL では CUDA と異なり CPU/GPU でコードを共通化することができないので CPU コードを GPU コードにコピーするときに機械的な作業で済むように CPU コードを十分チ 給電点 PEC 50 200 50 00 00 50 60 60 200 200 図 4 ベンチマーク問題 ( 単位 :mm ) 計算時間は表 6 の通りである 表 6 計算時間 ε r =2 ューニングしておく (4) カーネルに引数を渡すには clsetkernelarg 関数を使用し カーネルを起動するには clenqueuendrangekernel 関数 ( データ並列 ) を使用する (5) ワークアイテムの設定とパフォーマンスは CUDA と同じである No. ハードウェア 並列化手法 計算時間 速度比 CPU- 並列化なし 399. 秒 2 CPU- OpenMP 43.6 秒 2.78 3 CPU- スレッド 82.4 秒 2.9 4 CPU- MPI 40.6 秒 2.84 5 CPU-+CPU-2 MPI 82.7 秒 4.83 0. ベンチマーク以上で述べたプログラムの並列化の性能を評価するために図 4 のベンチマーク問題を計算する 誘電体ブロックの上にグラウンド板とモノポールアンテナが乗っているモデルであ 6 GPU- CUDA 2.4 秒 8.6 7 GPU- OpenCL 2.7 秒 8.4 8 GPU-2 OpenCL 6.7 秒 23.9 5

No.2-4 は CPU による並列化であり 4 コアで 3 倍弱速くなる その中で No.3 のマルチスレッドが比較的遅いがスレッド起 動のオーバーヘッドが比較的大きいことによる No.5 は 2 台 きる なお GPU についても MPI を用いてクラスタ化するこ とができるが ギガビットイーサネットでは性能は出ず より 高速なネットワーク環境が必要になる [] によるクラスタであり 台に比べて 2 倍弱速くなる No.6-8 は GPU による並列化であり No. に比べて 8-24 倍速くなるなお No.6-7 より同じ GPU では CUDA と OpenCL の性能はほぼ同じである. オープンソース化本プログラムは OpenFDTD という名前でオープンソースとして公開している [] 動作環境は Windows または Linux である 主な計算機能としては アンテナと伝送線路の周波数特性 指定した周波数での近傍界と遠方界の分布図などがある 計算結果は数値出力と図形出力が行われる 図形出力は HTML5 の Canvas 形式であり Web ブラウザで見ることができる 本プロプラムはエディタで入力データを作成し コマンドラインで計算を実行することを前提としているが Windows 用の簡易 GUI も添付している ( 図 5) また 複雑な入力データをプログラミングで作成するためのツール データ作成ライブラリー も付属している 文献 [] 株式会社 EEM "OpenFDTD" http://www.e-em.co.jp/openfdtd/ [2] OpenMP.org, http://openmp.org/wp/ [3] 株式会社フィックスターズ マルチコア CPU のための並列プログラミング 秀和システム 2006. [4] Message Passing Interface Forum, http://www.mpi-forum.org/ [5] P. パチェコ ( 秋葉博訳 ) MPI 並列プログラミング 培風館 200. [6] Open MPI, http://www.open-mpi.org/ [7] Microsoft, "HPC Pack 202 MS-MPI", http://www.microsoft.com/ja-jp/download/details.aspx?id=36045 [8] NVIDIA, "CUDA Downloads", https://developer.nvidia.com/cuda-downloads/ [9] NVIDIA, "CUDA C Programming Guide", http://docs.nvidia.com/cuda/cuda-c-programming-guide/ [0] NVIDIA, "CUDA C Best Practices Guide", http://docs.nvidia.com/cuda/cuda-c-best-practices-guide/ [] Khronos group, "OpenCL", https://www.khronos.org/opencl/ [2] Intel, "Intel SDK for OpenCL Applications 203", http://software.intel.com/en-us/vcsource/tools/opencl-sdk/ [3] NVIDIA, "OpenCL NVIDIA Developer Zone", https://developer.nvidia.com/opencl/ [4] AMD, "OpenCL Zone AMD", http://developer.amd.com/tools-and-sdks/opencl-zone/ 図 5 GUI プログラム [5] 株式会社フィックスターズ 改定新版 OpenCL 入門 イン プレスジャパン 202. 2. まとめ FDTD 法を並列化するために OpenMP マルチスレッド [6] 奥薗隆司 OpenCL 入門 秀和システム 200. [7] 宇野亨 FDTD 法による電磁界およびアンテナ解析 コロ ナ社 998. MPI CUDA OpenCL について述べた FDTD 法は並列化向きのアルゴリズムであり 並列化することによって計算時間を短縮することができる MPI を用いるとクラスタまたはスーパーコンピュータで大規模な計算を行うことができる また GPU を用いると安価で高速な計算環境を構築することがで 6