光ファイバーの特性の効率的計算
量子・物質工学専攻

植田研究室

柳谷 貴紀

平成 23 年 3 月 4 日

1Introduction

表 1: The machine spec.
CPU
Product NameIntel Core i7 920
Frequency [GHz]2.66#Cores(real, virtual)4, 8Memory Size [GB]3
Memory Bandwidth [GB/s]
32
GPU
Product NamenVidia Geforce GTX 480
Frequency [GHz]1.40#Cores480
Memory Bandwidth [GB/s]
177.6
Memory Size [GB]1.5
Max GFlops [GFlops]672

光（電磁波）とは、狭義には Maxwell’s equations(ME)に従う波である。その特性の解析には様々な手法が用いられる。例えば、特殊な光ファイバーである Photonic

Bandgap Fiber(PBGF) の解析には、ME を PBGF の
誘電率の周期性等で簡略化する Plane Wave Expansion

method(PWE) 等が用いられる。この手法は ME を最終的に行列の固有値問題に変え、計算は比較的高速である。
しかし、解析の対象となる物体の誘電率分布は無限に周期的であること等を仮定しており、そうでない場合には解析結果の精度が低いか全く解析できないことになる。
一方、より柔軟な解析手法として Finite DiﬀerenceTime Domain method(FDTD) がある。こちらは、解析の対象が有限であれば、誘電率分布がランダムであっても計算可能である。PWE と異なり解析対象に要求され前者の手法は、GPU メーカー側に可能な手法で、利用者側にできることではないが、将来的に行われることとなっている。後者の手法は、さらに以下のように分類できる。

る条件（周期性、一様性等）が緩く、代わりに計算に時

1. 特定の情報の圧縮をハードウェアで自動的に行う間のかかる（精度が要求される場合は特に）手法である。

FDTD の計算は、単純に実装する場合は四則演算のう
ち加減算および乗算が大部分を占める。計算装置としてGraphics Processing Unit(GPU) を用いる場合、それら

2. GPU 間の情報の転送3 の際に情報の圧縮を行う
3. GPU 内部での情報の転送の際に情報の圧縮を行う

３種の演算は大部分がハードウェア上に native に実装

最初の手法は、やはり利用者側にできることではないが、されており (native instruction, NI)、倍精度であれば 2

すでに行われていることである。次の手法は、利用者側

clocks 程度で計算可能である。この装置を用いる場合、「計算」にかかる時間の内、上記のような純粋な「計算」にかかる時間よりも、「計算」に必要な情報の「転送」にで既に行われた例がある。FDTD でも、規模がある程度以上（GPU 単体の記憶容量以上）であれば行う必要がある。最後の手法は、FDTD では行われた例がない。

より多くの時間を要する。つまり、長時間の計算の内、演

本論文ではこの手法を用いた場合の性能向上率を評価

算器が「演算」している時間よりも、演算器が「演算」にする。

必要な情報の「転送」を待っている時間の方が長い。

尚、圧縮を用いる場合の演算量の増大は現在の装置でこのため、FDTD のような転送速度により全体の計算は全く無視できないものであり、できる限り圧縮を用い時間が支配されるような計算では、演算器の性能を上げる場合がより優位になるようにした。よって、実用的にても「効率1 」はさほど向上しないため、以下のような手は圧縮を用いた場合はより不利になる。

法をとる必要がある。

• 演算器が情報の転送を待っている間、演算器の消費2電力のみを削減する• 演算器が情報の転送を待っている間、情報の転送量

装置
計算機の概要を表 1 に記載した。

2を削減するために情報の可逆圧縮 を行う
1 ここでは、単位消費電力当りの演算能力 (MFlops/W) とする。

3 現在、この種の転送時間は GPU 内部の最も遅いものと比べても数倍〜十倍程度遅い。

2 圧縮・展開の際に、情報が欠損しない。

1

計算は主に GPU で行うため、CPU については詳説しミクロに散逸していて、しかしマクロにはそうでなない。

い場合は一度まとめてこの Memory に転送しておく

前述のように、GPU は倍精度浮動小数点演算の加減と転送が効率化できる。

算、乗算を 2 clocks で実行できる。また、乗算＋加算

5. Registers: 計算の並列度が十分に高い場合、この記憶装置の読み書きに必要な時間は隠蔽（不可視）される。

(a = bc + d, MAD) も 2 clocks で実行できる。int の乗算や乗算＋加算、シフト演算、SAD(a = |b − c| + d, Sum

演算に大量に必要とされる場合は Global Memory がof absolute diﬀerence) も同様である。加算については 1clock で実行できる。型変換には 2 clocks を要する。

代用され、速度低下の要因となる。

上記に無い除算や初等関数等は、基本的に複数の NI に

上記仕様で重要なのは、Global Memory 等は一度に 128

よって構成されており、計算負荷が高い。このため、圧縮

Bytes もの情報を扱うということである。これは倍精度浮動小数点 16 個分に相当し、またそれら上位 8 bits の等にはできるかぎり NI を直接使うような手法をとった。

128 個分に相当する。圧縮の目的は情報の転送の削減であるが、128 Bytes 未満の削減では結局転送回数は 1 回も減らないため、大幅な転送時間短縮はできない。

次に GPU の記憶装置 (Memory) について説明する。
Memory には以下のようなものがある。

1. Global Memory: CPU の Memory に対応する GPUの Memory。GPU 内部では最も遅い。後述するより高速な L1、L2 Cache Memory に要求する情報がGPU には CPU と比較して大量の Core がある。前者のものは単純であり、最大の「効率」は高いが、複雑な処理（条件分岐等）をする場合は最大で 数十倍程度遅くある場合はそちらから読み込まれ、転送時間は短縮なる。後者のものは複雑であり、複雑な処理でも性能低される。L1 Cache Memory と同様に、1 度に 128

下の度合いは低い。

Bytes (1024 bits) 読み込む。

前者のものには以下のような階層構造がある。

2. L2 Cache Memory: Global Memory より高速で、L1
Cache Memory より低速な Cache Memory. 容量は

1. 1 GPU = 15 Multiprocessors: Multiprocessor の数
はデバイスに依存する。最新のものでは 1 GPU =Global Memory の 0.1% 程度。ハードウェアにより自動的に Global Memory の転送を効率化する。L1

16 Multiprocessors である。L2 Cache Memory を 1
つ持つ（すべての Multiprocessors で共有）。

Cache Memory 等と異なり、一度に 32 Bytes のみ
読み込むため、情報が散逸している場合はこちらのみを使う方が効率的な場合がある。

2. 1 Multiprocessor has up to 8 blocks: Block の数はデバイスに依存する。Multiprocessor は 処理中の1 個の block で「同期」が発生した場合、待ち時間

3. L1 Cache Memory: L2 Cache Memory より高速だ
が、一度に 128 Bytes 読み込むため情報が散逸してを隠蔽するために他の block の処理に切り替える。

16 × 2 = 32 個の Core を持ち、後述する 1 half-いる場合は無駄な読み込みが発生する。また容量はwarp を同時に 2 つ実行する。L1 Cache Memory とShared Memory を 1 つ持つ。その容量は block の数で等分される。

後述するように可変ではあるが、L2 の 10% 程度であり、さらに小容量である。その他の点については

L2 Cache Memory と同様。後述の Shared Memoryと同一の装置であり、L1 Cache Memory と Shared

3. 1 block has up to 6 warps: Warp の数はデバイスに依存する。異なる warp でのみ分岐が発生し、warp

Memory とで割合を変更することができる。詳細は後述。

内で分岐が発生しない場合は前述の分岐による性能低下は起こらない。

4. Shared Memory: 明示的に Global Memory から読使用する際、読み込む順序等に制限があり、その場

4. 1 Warp = 32 threads = 2 half-warps: 現在 threadの数はデバイス非依存である。本研究で用いるデバ
イスでは、1 Multiprocessor は 2 warp schedulers を

合は速度が低下する（最大で数十倍程度）。事前に持ち、それぞれが 1 half-warp を実行する。ただし、頻繁に使用する情報が予測できる場合はこちらを用

倍精度浮動小数点演算においては 1 Multiprocessor

い、できない場合は L1 Cache Memory を用いる。

は 1 warp scheduler のみ作動でき、単精度浮動小数

その場合は L1 Cache Memory を 48 kB に、Shared

点演算の半分の性能となる。

み書きをする高速・小容量メモリ。即ち、ハードウェ
アにより自動的に使用されることはない。明示的にMemory を 16 kB に、そうでない場合はその逆に設定する。一度に 4 Bytes のみ読み込むため、情報がまとめると、1 Multiprocessor は一度に 1 warp = 32

threads を処理し、それが 15 個ある。すなわち、15×32 =2

480 threads を同時に処理できる。1 Multiprocessor に最大の thread 数を割り当てる場合、すなわち最大の blocks/ multiprocessor と最大の warps / block を割り当てるとなる。実際には情報転送以外の演算や、圧縮・展開に場合、thread 数は 32 threads / warp、6 warps / block、演算量は次に述べるように倍精度浮動小数点数 1 個あた

8 blocks / multiprocessor の積 32 · 6 · 8 = 1536 となる。
圧縮を伴う FDTD では、情報は散逸しないように格り 3.75 × 2 = 7.5 clocks を超えているため、現在の情報

納することもできるため、前述した Shared Memory の

むしろ下がる。

要する演算に要する時間も有限であるため、性能向上は
これより低くなる。特に圧縮・展開により生じる余分な転送速度と演算速度との比率（およそ 15:1）では性能は方の容量を優先して 48 kB とする。

圧縮は次のように行う。

この場合、1 Multiprocessor 内では 48 kB の Shared

1. 演算結果の倍精度浮動小数点数のうち、上位 32 bits
を 32 bit integer として register に代入する: 6 clocks

Memory が 8 blocks で等分され、1 block あたり 6 kBとなる。これは倍精度浮動小数点数 768 個分に相当する。
2 つの 3 次元ベクトルと 2 つのスカラーを 1 セットとす
ると、96 セット分に相当する。

3

原理

3.1

一般

2. integer の絶対値をとる: 2 clocks
3. integer を右に 16 bits シフトする: 2 clocks
4. 上の手順を隣接する倍精度浮動小数点数についても行い、差分をとる: 2 clocks

sign bit の扱いを省略しても、圧縮だけで 12 clocks 要する。

Maxwell’s equations の空間微分や時間微分には除算が展開は以下のように行う。

含まれているが、これらは誘電率や透磁率を予め除しておくことで回避できる。

1. 倍精度浮動小数点数の下位 32 bits を 32 bit integer

前述のように圧縮はできるかぎり集中的に行う必要が

i1 に読み込む: 0 clocks

あるため、また「効率」の比較において圧縮を行う方をよ

2. 倍精度浮動小数点数の上位 32 bits の内の下位 16

り優位にするため、情報の格納の順番を圧縮用に最適化し、計算領域はなるべく 128 の整数倍となるようにした。

bits を 32 bit integer i2 に読み込む: 0 clocks

情報の圧縮方法には様々な手法があるが、多くの実用

3. 差分の基準となる上位 16 bits を 32 bit integer i3に読み込む: 0 clocks

化されている圧縮法は圧縮率優先で圧縮の際の計算負荷が高く、それを FDTD の計算中に行うと Memory の転

4. 差分の基準以外において差分の下位 8 bits を 32 bit
integer i4 に読み込む: 0 clocks

送速度の遅さよりもさらに遅くなってしまうため、本研究では極めて単純で計算負荷の軽い方法を用いた。

FDTD に限らず、多くの物理のシミュレーションの問

5. i′ = i3 + i4 を新たな差分の基準とする: 1 clock

題では隣接する情報は急激には変化しない（微分が有限である）。そのため、隣接する倍精度浮動小数点数の上位

6. i′′ = i′ を左に 16 bits シフトする: 2 clocks

bits は似た値をとり、その差分を integer の減算により求

7. i2 を i′′ に加える: 1 clock

めるとその integer の上位 bits には 0 が多く含まれるよ

8. unsigned long long int i′2 に i2 を代入する: 0 clocks

うになる。差分には様々な求め方があるが、例として倍精度浮動小数点数の sign bit を除く上位 16 bits の差分を

9. i′2 を左に 32 bits シフトする: more than 2 clocks,

32 bit integer の減算により求めると、その integer の上
位 24 bits は 0 となりやすい。単純な Waveguide の例でassuming 4 clocks
10. i′2 に i1 を加える: more than 3 clocks, assuming 4
clocksは、ほぼ 100 % の領域で上位 24 bits は 0 となった。元の情報量は 16 bits であるから、この場合 倍精度浮動小数点数 1 個あたり 8 bits 分だけ圧縮により情報量を減ら

ここでも sign bit の扱いについては省略したが、それでもせることになる。本研究で用いる装置では、倍精度浮動小展開だけで 12 clocks かかる。なお、以上において圧縮で数点数 64 bits の読み書きに 30 clocks 程度要するため、きるかどうかのチェックは一切していないが、Waveguide

8 bits では 3.75 clocks 時間を短縮できることになる。すなわち、圧縮・展開に要する余分な演算量の増加を無視しのような例では全領域において圧縮可能であるためチェックに要する時間については無視する。

たときの性能向上の理論最大値は 30/(30 − 3.75) = 114%

3

以上のように、圧縮・展開あわせて最低でも 24 clocks// %REG* is a 64-bit register.
// %Reg* is a 32-bit register.
// %reg* is a 16-bit register.

必要であり、これは 8 bits の読み書きに必要な 7.5 clocksのおよそ 3 倍となるため、前述のように性能は低下する。
この方法でわずかにでも性能向上を求めるためには、現// 4 registers.
// Each register has least significant 32//
bits of a double precision floating//
point number.
mov.b32 %Reg32A, 0xGHIJ-KLMN;
mov.b32 %Reg32B, 0xUVWX-YZab;mov.b32 %Reg32C, 0xijkl-mnop;
mov.b32 %Reg32D, 0xwxyz-@?=*;

在よりもさらに 4 倍程度情報転送速度と演算速度との比率が開く必要がある。
以上の方法は、結局のところ FDTD にも光学分野にも限る必要はなく、必要な条件は隣接する情報間の差のオーダーが一定値以下であることのみである。

3.2// 2 registers.
// Each register consists of two 16-bit//
parts.
//// A 16-bit part has least significant 16//
bits of most significant 32 bits of//a double precision floating point//
number.
mov.b32 %Reg16AB, 0xCDEF-QRST;
mov.b32 %Reg16CD, 0xefgh-stuv;

誘電率の圧縮FDTD で光ファイバーを扱う場合は、誘電率の取りうる値が限られているためより効率的な圧縮が可能である。
比誘電率 εr は
1.0 ≤ εr ≤ 32768.0 = 215(1)を満たす場合が多い。この範囲を倍精度浮動小数点で表// 1 register with four 8-bit parts.
// An 8-bit part has least significant 8//
bits of most significant 16 bits of a//double precision floating point//
number.
mov.b32 %Reg8ABCD, 0xABOP-cdqr

すと
0x3ff0-0000-0000-0000 から 0x40e0-0000-0000-0000となる。これに 2 を乗じると 0x4000-0000-0000-0000 から 0x40f0-0000-0000-0000 となり、上位 8 bits はともに// Unpack 2 registers with four 16-bit//
parts and store the results in 4//
registers.
// Data movement instruction(mov) only.
//
mov.b32 {%reg16B, %reg16A}, %Reg16AB;// 0xQRST, 0xCDEF <- 0xCDEF-QRST
mov.b32 {%reg16D, %reg16C}, %Reg16CD;// 0xstuv, 0xefgh <- 0xefgh-stuv

0x40 となる。つまり、2εr については上位 8 bits は 0x40となるから、その部分については格納する必要も読み込む必要もなくなり、それ以外の 56 bits のみ読み込めば良いこととなる。2εr ではなく εr が必要な場合は、計算に定数が含まれる場合はそれに 2 を乗じるか除すれば 2εr から εr を復元するのに余分な演算は発生しない。
そうでなくても、2 の累乗の乗算や除算は倍精度浮動小// Unpack a register with four 8-bit parts//and store the intermediate results in//2 registers, each of which has two//
8-bit parts.
// These 2 registers also should be//
unpacked later.
mov.b32 {%reg8CD, %reg8AB}, %Reg8ABCD;// 0xcdqr, 0xABOP <- 0xABOP-cdqr

数点の指数部分の加減算で代用できるため 2 clocks ではなく 1 clock で実行できる。同様にして、ε ≡ ε0 εr は0x3da3-7876-f14d-ed31 から 0x3e93-7876-f14d-ed31 の範囲であり、それに 26 を乗じると 0x3e03-7876-f14d-ed31
か ら 0x3ef3-7876-f14d-ed31 と な り、と も に 上 位 8
bits は 0x3e と な る 。ε−1 は 0x423a-4bcd-78b3-d090
か ら 0x414a-4bcd-78b3-d090、こ れ に 2−4 を 乗 じ て// Unpack 2 registers with four 8-bit//
parts and store the results in 4//
registers.
// Since current multiprocessor does not//have a native instruction which//
unpacks a 16-bit register to two//
8-bit registers, such kind of//functionality must be implemented by//multiple native instructions.
// The use of add.s32, mad.lo.s32 and//shl.b32 was chosen to minimize//
extra computation time, though this//
implementation has both of two kinds//of functionality -- that is, two

0x41fa-4bcd-78b3-d090 から 0x410a-4bcd-78b3-d090、上位 8 bits は 0x41 となる。

64 bits をそのまま読み込む場合、転送時間以外の時間
は 0 である。56 bits のみ読み込む場合、前述のように 128
bytes 単位以外での読み込みは効率が悪いため、sharedmemory に 128 bytes 単位で読み込みそこからさらに 32
bits 単位で読み込む。56 × 4 = 8 · 4 + 16 · 4 + 32 · 4 =32 + 32 · 2 + 32 · 4 であるから、誘電率は 4 つセットで読み込む。この場合の擬似コードは以下のようになる。

4//kinds of functionality was combined://(1) unpack//(2) recover most significant 16 bits//by packing 0x41 and the unpacked 8//
bits.
mov.b16 %regZero, 0x0000;
mov.b32 %Reg8zzAB, {%reg8AB, %regZero};// 0x0000-ABOP <- 0xABOP, 0x0000
mov.b32 %Reg8zzCD, {%reg8CD, %regZero};// 0x0000-cdqr <- 0xcdqr, 0x0000
shl.b32 %Reg8zABz, %Reg8zzAB, 8;// 0x00AB-OP00 <- 0x0000-ABOP0
shl.b32 %Reg8zCDz, %Reg8zzCD, 8;// 0x00cd-qr00 <- 0x0000-cdqr
mov.b32 {%reg8Bz, %reg8zA}, %Reg8zABz;// 0xOP00, 0x00AB <- 0x00AB-OP00
mov.b32 {%reg8Dz, %reg8zC}, %Reg8zCDz;// 0xqr00, 0x00cd <- 0x00cd-qr00
mov.b32 %Reg8zAzC, {%reg8zC, %reg8zA};// 0x00AB-00cd <- 0x00cd, 0x00AB
add.s32 %Reg8fAfC, %Reg8zAzC, 0x4100-4100;// 0x41AB-41cd <- 0x00AB-00cd
mov.b32 {%reg8fC, %reg8fA}, %Reg8fAfC;// 0x41cd, 0x41AB <- 0x41AB-41cd
mov.b32 %Reg8zzBz, {%reg8Bz, %regZero};// 0x0000-OP00 <- 0xOP00, 0x0000
mov.b32 %Reg8zzDz, {%reg8Dz, %regZero};// 0x0000-qr00 <- 0xqr00, 0x0000
mad.lo.s32 %Reg8fBzz, 0x0000-0100,\%Reg8zzBz, 0x4100-0000;// 0x41OP-0000 <- 0x0000-OP00
mad.lo.s32 %Reg8fDzz, 0x0000-0100,\%Reg8zzDz, 0x4100-0000;// 0x41qr-0000 <- 0x0000-qr00
mov.b32 {%regTrash, %reg8fB}, %Reg8fBzz;// 0x0000, 0x41OP <- 0x41OP-0000
mov.b32 {%regTrash, %reg8fD}, %Reg8fDzz;// 0x0000, 0x41qr <- 0x41qr-0000// 0x41qr-stuv-wxyz-@?=*//<- 0xwxyz-@?=*, 0x41qr-stuv

ただし 2−4 ε−1 を0x41AB-CDEF-GHIJ-KLMN、0x41OP-QRST-UVWX-YZab、
0x41cd-efgh-ijkl-mnop、0x41qr-stuv-wxyz-@?=*と し 、読 み 込 み で は な く 即 値 代 入 の よ う に 表 現 し た（[A-Za-z@?=*] は 0 ∼ f）。上記のような実装をした場合、mov を 0 clock とすれば、圧縮・展開による余分な演算量
は 1 add.s32, 2 shl.b32, 2 mad.lo.s32 （それぞれthroughput は 32, 16, 16）合計で 1+2·2+2·2 = 9 clocksとなる。1 double precision ﬂoating point number あたり
8 bits の読み込みの省略であるから、4 つでは 32 bits となり、情報転送量削減による時間の短縮は 30 · 32/64 = 15

clocks となる。よって、全体では 15 − 9 = 6 clocks の短縮となる。shl.b32, mad.lo.s32 の throughput が 32となれば、15 − 5 = 10 clocks の削減となる。
いずれにせよ、情報転送時間に比して演算時間が 0 とみなせるような圧縮に最大限有利な条件を想定しても、誘電率の上位 8 bits のみの圧縮による効率の上昇率は前述の 114 % を下回る。

3.3

電磁場の圧縮前述の誘電率専用の圧縮方法では、仮定により全領域での圧縮が可能であるため圧縮が可能であるかどうかの判定は不要であり、GPU のような分岐が不得意な計算機には好都合であった。
一方、電磁場の場合、waveguide のような単純なもの// Recover most significant 32 bits.
mov.b32 %Reg8fAAA, {%reg16A, %reg8fA};// 0x41AB-CDEF <- 0xCDEF, 0x41AB
mov.b32 %Reg8fBBB, {%reg16B, %reg8fB};// 0x41OP-QRST <- 0xQRST, 0x41OP
mov.b32 %Reg8fCCC, {%reg16C, %reg8fC};// 0x41cd-efgh <- 0xefgh, 0x41cd
mov.b32 %Reg8fDDD, {%reg16D, %reg8fD};// 0x41qr-stuv <- 0xstuv, 0x41qr

でも圧縮可能領域は 100 % にはならず（例示にあまり意
味は無いが一例をあげれば 90%程度）、圧縮の判定の必要性がある。この場合、演算量の増加を無視しても分岐による性能低下（現在は最大 1/32 倍）は無視できないた
め、圧縮可能領域の割合が低いか散逸している場合は圧縮による性能向上は期待できない。
仮に 100% の領域で圧縮可能であっても、誘電率の場// Recover full 64 bits.
mov.b64 %REG8fAAA-AAAA,{%Reg32A, %Reg8fAAA};// 0x41AB-CDEF-GHIJ-KLMN//<- 0xGHIJ-KLMN, 0x41AB-CDEF
mov.b64 %REG8fBBB-BBBB,{%Reg32B, %Reg8fBBB};// 0x41OP-QRST-UVWX-YZab//<- 0xUVWX-YZab, 0x41OP-QRST
mov.b64 %REG8fCCC-CCCC,{%Reg32C, %Reg8fCCC};// 0x41cd-efgh-ijkl-mnop//<- 0xijkl-mnop, 0x41cd-efgh
mov.b64 %REG8fDDD-DDDD,{%Reg32D, %Reg8fDDD};合と異なり電磁場は基本的に時間の関数であり、読み込
み専用ではないため展開だけでなく圧縮も行う必要があり、また指数部分であっても直接の圧縮はできず差分をとる必要があるため、誘電率の場合と比べ圧縮による性能向上はより難しくなる。
そこで、一般的に成り立つ方法ではなく特定の計算機にのみ有効な方法を考える。
実際の計算機では、throughput 16 の演算は throughput

32 の演算の 2 倍の時間で演算が完了しないことがある。
例えば、前者の演算を 10 回行った場合、後者の演算を 20回行った場合と同じ時間で演算が完了されると予想され

5

るが、実際には 30 回分の時間がかかったとする。このとCUDA Toolkit Reference Manual.pdf, (参照 2011-01-15).

き、差分の 10 回分の後者の演算を追加で行っても演算時間が微増にとどまるといったことが起こる。すなわち、前[5] NVIDIA corporation, Fermi Compatibility Guide

者の演算が予想より低い効率となってしまった場合に、後for CUDA Applications. Version 1.3. 2010. (online), http://developer.download.nvidia.com/co-

者の演算を追加で行うことで予想通りの効率を実現できる。このような現在の計算機に特有の性質を逆手にとれ

mpute/cuda/3 2 prod/toolkit/docs/Fermi Compatibility Guide.pdf, (参照 2011-01-15).

ば、つまり偽の余剰演算能力を圧縮に利用すれば、実用上は計算効率の向上が期待できる。その偽の余剰演算能力が十分であれば、前述のような単純な演算による圧縮[6] NVIDIA corporation, Tuning CUDA Application-（低圧縮率）ではなく、より複雑な演算による圧縮（高圧る可能性もある。この場合は誘電率のような定数でなく、

s for Fermi. Version 1.3. 2010. (online), http://developer.download.nvidia.com/compute/cuda/3 2
prod/toolkit/Fermi Tuning Guide.pdf, (参照 2011

電磁場のような変数でも実用的に圧縮しながらの演算に-01-15).

縮率）を行うことで、前述の 114% の性能向上率を超えよる効率向上が期待できる。
しかし、この種の方法は hardware の改善によって無効になるものであり、将来性に欠けるものである。

4

まとめ
以上より、FDTD 法を情報圧縮により高速化するためには、誘電率を特定の範囲内に制限する方法は有効であることが分かった。また、電磁場等の圧縮や誘電率の高圧縮を行うことによる性能向上のためには、現在の計算機の欠点を利用することが有効であることが分かった。

参考文献[1] NVIDIA corporation, CUDA C Programming Guide. Version 3.2. 2010. (online), http://developer.
download.nvidia.com/compute/cuda/3 2 prod/toolkit/docs/CUDA C Programming Guide.pdf,(参照 2011-01-15).
[2] NVIDIA corporation, PTX ISA. Version 2.2. 2010.
(online), http://developer.download.nvidia.com/
compute/cuda/3 2 prod/toolkit/docs/ptx isa 2.2.pdf, (参照 2011-01-15).
[3] NVIDIA corporation, CUDA C Best Practices Guide. Version 3.2. 2010. (online), http://developer.download.nvidia.com/compute/cuda/3 2 prod/
toolkit/docs/CUDA C Best Practices Guide.pdf,(参照 2011-01-15).
[4] NVIDIA corporation, Reference Manual. Version
3.2. 2010. (online), http://developer.download.nvidia.com/compute/cuda/3 2 prod/toolkit/docs/

6