■サンプルファイルのダウンロードについて
本書掲載のサンプルファイルは、一部を除いてインターネット上のダウンロードサービスからダウンロードすることができます。詳しい手順については、本書の巻末にある袋とじの内容をご覧ください。
なお、ダウンロードサービスのご利用にはユーザー登録と袋とじ内に記されている番号が必要です。そのため、本書を中古書店から購入されたり、他者から貸与、譲渡された場合にはサービスをご利用いただけないことがあります。あらかじめご承知おきください。

・本書の内容についてのご意見、ご質問は、お名前、ご連絡先を明記のうえ、小社出版部宛文書（郵送または E-mail）でお送りください。
・電話によるお問い合わせはお受けできません。
・本書の解説範囲を越える内容のご質問や、本書の内容と無関係なご質問にはお答えできません。
・匿名のフリーメールアドレスからのお問い合わせには返信しかねます。
本書で取り上げられているシステム名／製品名は、一般に開発各社の登録商標／商品名です。本書では、™ および ® マークは明記していません。本書に掲載されている団体／商品に対して、その商標権を侵害する意図は一切ありません。本書で紹介している URL や各サイトの内容は変更される場合があります。

はじめにコンピュータの性能追求は永遠のテーマです。特に近年は、高速化の手段として並列化が採用される機会が多くなりました。本書は、並列プログラミングに主眼を置いて解説しますが、結果として高速化にも貢献するでしょう。
近年になり、疎結合の並列化ではないメニーコアやアクセラレータを活用し、粒度が小さく並列化数が多い環境を一般の開発者が利用できる環境が整いつつあります。代表的な例を挙げれば、メニーコアを活用する OpenMP、アクセラレータを活用する OpenCL、CUDA、OpenACC、ベクトル演算を可能にした SIMD 命令などです。これらの環境を廉価、あるいはフリーで使用できる環境が揃ったと言えるでしょう。
そのような環境を一般的なパーソナルコンピュータ上に構築できる時代が到来したことを受けて、これらの並列処理の入門と、それぞれの利点や欠点、あるいは目的の違いを理解するために本書は企画されました。少し前までは、メニーコアを活用するソフトウェアの開発は容易ではなく、また、アクセラレータを活用するのはとても難しい作業でした。ところが今や、開発環境、特に遅れていたソフトウェア側の環境が整備され、比較的容易にこれらのハードウェア環境を活用できるようになりました。
ハードウェアからの観点では、最近の CPU はベクトル命令を標準で装備し、複数のコアを搭載しているのが普通です。さらには、比較的低速なものですがアクセラレータも CPU ダイに実装されています。このような背景から、理論だけでなく実際のプログラムを交えた考察が行えるようになりました。

IT 技術の発展により、一般家庭に一昔前のスーパーコンピュータ並のシステムを導入できる時代となりました。高速なメニーコア CPU、高速で大容量のメモリ、SSD などの高速記憶装置、GPGPU を搭載したボード、そして高機能なコンパイラやプロファイラが容易に入手可能です。
どうぞ、このような環境を土台にして、並列処理を活用した高度なシミュレーションや科学技術計算に挑戦してください。きっと素晴らしい発見ができるでしょう。この恵まれた環境を活用し、新しい発明や考案、そして発見ができることを期待します。きっと、先人の努力に感謝するとともに、後に続く人の礎となることでしょう。

iii

対象読者

. ●. 並列コンピューティング入門者. ●. SIMD、スレッド、OpenMP、OpenCL、OpenACC などのプログラミング入門者. ●. さまざまな並列化手法の間にある違いを知りたい人. ●. 並列処理と同期の入門者
謝辞
出版にあたり、お世話になった株式会社カットシステムの石塚勝敏氏に深く感謝いたします。

2019 年、平成最後の春.桜満開の東京都東大和南公園にて 北山洋幸

iv

本書の使用にあたって開発環境、および、実行環境の説明を行います。

環境
本書は開発や環境の解説書ではなく、並列コンピューティングの解説書です。本来なら仕様の説明に終始しても良いのですが、それでは理解が進みません。そこで、解説と実際のプログラムを試しながら理解を進める手法を採用します。ただし、あらゆる開発環境でビルド・実行できることを保証するものではありません。特に、開発環境の変更やバージョンアップによって、動作していたものが動作しなくなったり、あるいはその逆も起きます。
このため、特定の環境について言及しません。筆者のテスト環境では、OpenMP は Visual.

Studio や g++、OpenACC は gcc や g++ そ し て PGI. 社 の pgcc、OpenCL は Intel 社 の 環 境 やNVIDIA 社の環境で g++ や Visual.Studio を、SIMD も g++ や Visual.Studio を使用しました。いくつかの環境は設定が面倒なものもあります。本書では環境構築については解説しませんので、適切な環境を自身で構築してください。

コンパイラ
前述の通り、本書は特定の言語や開発環境の解説書ではありませんので、開発環境の構築にページは割いていません。紹介したプログラムは、以降に示すいずれかの環境で実験しました。
簡単に使用した環境を紹介します。基本的に無償のコンパイラを使用します。もちろん、有償の強力なコンパイラを利用できればそちらを使用すると良いでしょう。以降に示すものの、いずれか、あるいはいくつか併用すると良いでしょう。

Visual Studio
ス レ ッ ド プ ロ グ ラ ム や OpenMP の 2.0 未 満、 お よ び OpenCL な ど は Visual.Studio の C++で 開 発 可 能 で す。 主 に Visual.Studio.Community.2017 を 使 用 し ま し た が、Visual.Studio.

Community.2019 でも問題は起きないと思います。いくつかのプログラムは Visual.Studio.
Community.2019 で確認しました。

pgcc/pgc++
PGI 社の PGI.Community.Edition を使用するのも良い方法です。本書では、PGI.Community.

v

Edition.18.4 を使用しました。PGI.Community.Edition は無償で使用できます。Windows 用の
PGI.Community.Edition は C++ をサポートしていませんので、C 言語で記述しました。Ubuntu
へ PGI.Community.Edition をインストールした場合は、pgc++ を使用すると C++ で書かれたプログラムもビルドできます。本書の執筆時点では、OpenACC の実装は PGI 社のコンパイラが最も進んでいるように感じました。

g++/gccg++ を使用すると、ほぼすべてのプログラムを実際に試すことができます。本書では、g++ のバージョンは 7.3.0 や 8.2.0 を使用します。gcc でも可能なプログラムも多いですが、g++ を利用する方が問題は起きにくいでしょう。

OS と、そのバージョン
WindowsWindows.10.Pro/Home を利用しました。Windows.7 などでも問題ないと思われますが確認は行っていません。

Ubuntuバージョン 18.10 や 18.04 を使用します。他のバージョンでも問題ないと思われますが確認は行っていません。gcc は標準でインストールされている場合もありますが、そうでない場合は案内メッセージが表示されますので、それに従って gcc/g++ をインストールしてください。

ソースコードエンコード
ソースコードには、なるべく UTF-8 を使用します。特にマルチバイト文字が含まれる場合は、エンコードに注意してください。文字化けなどが起きる場合は、英文を使用するかエンコードを確認してください。

URL
本書に記載されている URL は執筆時点のものであり、変更される可能性もあります。リンク先が存在しない場合、キーワードなどから自分で検索してください。

vi

用語用語の使用に関して説明を行います。

メモリとメモリー
最近は語尾の「ー」を付けるのが一般的になっていますが、本書では従来のように、基本的に「メモリー」は「メモリ」と表記する場合が多いですが、混在するときもあります。

ソースコードとソースファイル基本的に同じものを指します。まとまったものをソースファイル、ソースファイルの一部を指すときにソースコードと表現します。

指示文、構文、ディレクティブ
本書は、指示文、構文、ディレクティブを混在して使用しています。どれも同じものですので、適切に読み替えてください。節と指示句
指示文にオプションで指定する copyin などを、copyin 節と記載している部分と copyin 指示句と記載している部分が混在します。節と指示句はどちらも同じものを指しますので、適切に読み替えてください。

リージョンと領域
リージョンと領域という表現も混在して使用しています。単に、カタカナ英語と日本語の違いです。両方とも同じものですので、適切に読み替えてください。

アクセラレータとデバイスアクセラレータとデバイスも同じものですが、混在して使用します。厳密には異なる用語です。処理をオフロードする際に、一般的にデバイス側へオフロードしますが、アクセラレータと表現する場合もあります。

vii

アクセラレータと GPU
アクセラレータの具体的な例の 1 つが GPU です。アクセラレータと GPU も混在しますが、適切に読み替えてください。

GPU と GPGPUGPU と GPGPU は同じようなものですが、混在して使用します。厳密には異なる用語ですが、文脈で使い分けています。特に違いはないので、同じものを指します。

viii

目 次

目

次

目次

はじめに...................................................................................................................................................iii

第 1 章 コンピュータ概論 …… 1
1.1

ハードウェアから観察したコンピュータの構成..............................................................11.3

データモデル.............................................................................................................................6

1.2

ソフトウェアから観察したコンピュータの構成..............................................................4

第 2 章 CPU 概論 …… 9
2.1

CPU とは....................................................................................................................................92.3

アドレス変換器...................................................................................................................... 12

2.2

2.4
2.5
2.6
2.7
2.8
2.9

CPU の内部構成.................................................................................................................... 10命令デコーダ.......................................................................................................................... 12レジスタ群.............................................................................................................................. 13制御器....................................................................................................................................... 14
CPU はどうやって命令を処理するのか.......................................................................... 14

CPU の変遷............................................................................................................................. 15

レジスタとは.......................................................................................................................... 18

2.10 実際のレジスタ...................................................................................................................... 19
2.11 CPU の分類............................................................................................................................. 23
2.12 まとめ....................................................................................................................................... 36

第 3 章 メモリ概論 …… 39
3.1

ハードウェアから観察したメモリの構成........................................................................ 40

3.3

データの流れ.......................................................................................................................... 43

3.2
3.4
3.5
3.6
3.7

メモリの種類.......................................................................................................................... 43
キャッシュメモリ.................................................................................................................. 44

RAM と ROM......................................................................................................................... 46
メモリとアドレス.................................................................................................................. 49
二次記憶装置とは.................................................................................................................. 52ix

第 4 章 並列化概論 …… 59
4.1

逐次処理と並列処理.............................................................................................................. 62

4.3

並列化の限界.......................................................................................................................... 73

4.2
4.4

並列化の分類.......................................................................................................................... 68
並列化の課題.......................................................................................................................... 76

第 5 章 スレッド …… 79
5.1

シングルスレッドとマルチスレッドの基礎.................................................................... 80

5.3

簡単なスレッドプログラム................................................................................................. 84

5.2
5.4

シングルスレッドプログラムとマルチスレッドプログラムの詳細......................... 81

1 次元配列同士の乗算.......................................................................................................... 92

第 6 章 OpenMP …… 99
6.1

概要........................................................................................................................................... 99

6.3

OpenMP らしいプログラム............................................................................................ 104

6.2
6.4
6.5
6.6

簡単な OpenMP プログラム........................................................................................... 101

指示文.................................................................................................................................... 112
共有変数とプライベート変数.......................................................................................... 113

1 次元配列同士の乗算....................................................................................................... 119

第 7 章 OpenACC …… 123
7.1

概要........................................................................................................................................ 123

7.3

OpenACC の機能.............................................................................................................. 124

7.2
7.4
7.5
7.6
7.7
7.8
7.9

ディレクティブベースの魅力.......................................................................................... 124

指示文の概要....................................................................................................................... 125
データの移動....................................................................................................................... 127
はじめてのプログラム...................................................................................................... 128
kernel ディレクティブと parallel ディレクティブ................................................... 132

data ディレクティブ......................................................................................................... 135
1 次元配列同士の乗算....................................................................................................... 137

第 8 章 OpenCL …… 143
8.1
8.2

x概論........................................................................................................................................ 143
データ並列とタスク並列.................................................................................................. 145

目 次

8.3

OpenCL C 言語.................................................................................................................. 145

8.5

1 次元配列同士の乗算....................................................................................................... 174

8.4

はじめてのプログラム...................................................................................................... 146

第 9 章 ベクトル化 …… 187
9.1

SIMD とは............................................................................................................................ 187

9.3

SIMD 命令で扱うデータ形式.......................................................................................... 189

9.2
9.4
9.5
9.6
9.7
9.8

SIMD の概要........................................................................................................................ 188
SIMD 命令とは.................................................................................................................... 189
GPGPU のベクトル命令（SIMD）................................................................................. 190

はじめてのプログラム...................................................................................................... 190
1 次元配列同士の乗算....................................................................................................... 203
OpenCL のベクトル.......................................................................................................... 208

第 10 章 行列の積 …… 213

10.1 逐次........................................................................................................................................ 214

10.2 OpenMP............................................................................................................................... 216
10.3 OpenACC............................................................................................................................ 220
10.4 OpenCL................................................................................................................................ 223

第 11 章 メモリ …… 247

11.1 メモリアクセスとキャッシュメモリ............................................................................. 247
11.2 2 次元配列の全要素を変更.............................................................................................. 252

11.3 データを局所化................................................................................................................... 253

11.4 OpenMP のメモリ............................................................................................................. 257

11.5 OpenACC のメモリ.......................................................................................................... 258
11.6 OpenCL のメモリ.............................................................................................................. 265
11.7 SIMD とメモリ.................................................................................................................... 277

第 12 章 並列と同期 …… 287

12.1 Fork-Join モデル................................................................................................................ 287

12.2 処理内容................................................................................................................................ 293
12.3 スレッドと同期................................................................................................................... 296

12.4 OpenMP と同期................................................................................................................. 304

xi12.5 OpenACC と同期.............................................................................................................. 315
12.6 OpenCL と同期.................................................................................................................. 326

第 13 章 OpenMP のリファレンス …… 343

13.1 指示文.................................................................................................................................... 343

13.2 simd 関連の構文................................................................................................................ 350

13.3 target 関連の構文.............................................................................................................. 353

13.4 指示句.................................................................................................................................... 358
13.5 実行時ライブラリ............................................................................................................... 364

13.6 環境変数................................................................................................................................ 376

第 14 章 OpenACC のリファレンス …… 381

14.1 Accelerator Compute ディレクティブ..................................................................... 382

14.2 data ディレクティブ......................................................................................................... 39014.3 enter data と exit data ディレクティブ（OpenACC 2.0）................................. 396

14.4 loop ディレクティブ......................................................................................................... 399
14.5 実行時ライブラリ............................................................................................................... 402

第 15 章 OpenCL のリファレンス …… 417

15.1 OpenCL API....................................................................................................................... 417
15.2 OpenCL 構造体.................................................................................................................. 462

15.3 OpenCL 組込み関数.......................................................................................................... 466

参考文献、参考サイト、参考資料............................................................................................... 468
索  引................................................................................................................................................... 470xii

1
コンピュータ概論
第1章

コンピュータ概論

本章では、コンピュータ（計算機）の概要について解説します。まず、ハードウェア側およびソフトウェア側から観察した構成について説明し、それからデータモデルについて簡単に説明します。

1.1 ハードウェアから観察したコンピュータの構成
1.1 ハードウェアから観察したコンピュータの構成
コンピュータを一言で表現するのは難しくなってきています。一昔前までは、外見は異なっても単純にモデル化できました。ところが、今日では用途に向けて多様化したコンピュータが現れてきています。しかし、どのようなコンピュータシステムであれ基本的な構成は同じです。
コンピュータの外観を観察しただけでは、各々の役割を判断するのは簡単ではありません。そこで、コンピュータの基本構成をハードウェアの観点から整理してみましょう。

1

1 コンピュータ概論

CPU

YMM6

メモリや HDD など

ディスプレイやキーボ ード、マウスなど

図1.1●ハードウェアから見たコンピュータの基本構成

この図をモデル化すると次のようになります。
処理部

記憶部

入出力部

図1.2●ハードウェアから見たコンピュータのモデル化

このように、コンピュータのハードウェアをモデル化すると、「処理部」、「記憶部」、および「入出力部」に分類できます。これはどのようなコンピュータにも当てはまります。近年はコンピュータも多様化しており、スマートフォンとブレードサーバーが同じものとは考えにくいですが、モデル化すればどちらも同じです。コンピュータは多数の機器で構成されますが、それらは前述した分類のいずれかに属します。例えば、シリコンディスクやメモリは記憶部に分類され、タッチスクリーンや液晶ディスプレイは入出力部に分類されます。処理部は、演算や判断を受け持つコンピュータの心臓部です。
以降に各部の詳細を解説します。

2

1.1

ハードウェアから観察したコンピュータの構成

1
細かく分類したときのモデル

2

コンピュータハードウェアのモデル化については、処理部を演算処理部と制御処理部に分離し、入出力部を入力部と出力部に分離して、次のような 5 つのブロッ

3クに分ける考え方もあります。

4演算部
制御部

記憶部

5
出力部

入力部

6
図1.3●細分化したコンピュータハードウェアモデル

7

1.1.1 処理部

8

一般に CPU（中央処理装置）と呼ばれる部分です。現在、CPU といえばマイクロプロセッサ、つまり、独立した 1 つのチップ（LSI）を指すことが大半ですが、複数のチップで構成されても9構いません。この処理部はプログラムとデータに従い、演算や判断を繰り返すコンピュータの心臓部です。処理部には 2 つの大きな仕事があります。1 つは乗算や論理積などの演算処理です。

10

もう 1 つの大きな仕事は制御処理であり、比較などを行って状況を判断し、制御の流れを変えることです。

111.1.2 記憶部

12記憶部とは、先に説明した処理部が必要とするデータや命令を格納する部分を指します。ま13

た、処理結果を記憶する目的にも使用します。記憶部は、一般的にメモリと呼ばれる場合が多いです。メモリには大きく分けて、書き込み・読み込み可能なメモリである RAM と、読み込み専14用メモリである ROM があります。しかし現代では、どちらも多様化して両方の性格を備えるものも存在し、純粋な ROM を使う機会は減って Flash.ROM などの不揮発メモリが使われるようになりました。

15

ハードディスク（HDD）やブルーレイなども記憶装置に分類されます。これらは、メモリに比べ速度が遅く、用途が異なります。このため、メモリ（一次記憶装置）と区別して外部記憶装3

1 コンピュータ概論
置（二次記憶装置）と分類されます。二次記憶装置と一次記憶装置の違いは、速度が異なること、そして大きな違いは、CPU から直接アクセスできないことです。さらに、電源を切っても記憶が消えないことです。外部記憶装置はメモリに比較して、アクセス速度は非常に遅くなります。最近では flash メモリなど外部記憶装置として使用することも多いです。これらはメモリと呼ばれますが、分類としては二次記憶装置です。ところが flash メモリを CPU 空間に実装する場合もあります。これは CPU からアクセスできるが、速度は遅い、電源を消しても内容が消えないなど、一次記憶装置と二次記憶装置の特徴を併せ持ちます。一昔前のように、単純に一次記憶装置、二次記憶装置を分類しにくくなっています。また、flash メモリの速度も、さまざまな改良を経て決して遅いとは言えなくなっています。

1.1.3 入出力部
入出力部は入力部と出力部に分けられます。主に人間とコンピュータの橋渡しを行う部分です。通常のコンピュータでは、コンピュータに指示を与える場合はタッチパッドやキーボードを使います。これらが入力部です。コンピュータが処理した結果は、液晶ディスプレイやプリンタへ出力されます。これらが出力部です。
ネットワークなどは、入力部と出力部を兼ねています。例えば、サーバーなどを人間が操作することはなく、入出力部はネットワークインタフェースと考えれば良いでしょう。ネットワークインタフェースは、入力部と出力部を兼ねた装置です。近年においては、ネットワークは入出力の最も主要な部分を占めるようになり、ネットワークにつながれていないコンピュータは機能がかなり限定されます。

1-2 ソフトウェアから観察したコンピュータの構成
1.2 ソフトウェアから観察したコンピュータの構成
前節では、コンピュータがどのようなハードウェアから構成されているかを解説しました。ここでは、ソフトウェアから観察したコンピュータの構成を解説します。ハードウェアの構成は視覚的に認識できるものがほとんどですが、ソフトウェアは視覚的に認識できません。
大昔、「コンピュータ、ソフトなければただの箱！」という表現が流行したことがあります。
しかし、これは正確ではないでしょう。現代のコンピュータは、ハードウェア、ソフトウェア（とネットワーク）がなければただの箱です。これらは優先順位を付けられるものではなく、すべてが揃って初めて機能を発揮します。

4

1.2

ソフトウェアから観察したコンピュータの構成

さて、話を元に戻しましょう。ソフトウェアもハードウェアと同様、次図のようにモデル化で1きます。

アプリケーションソフトウェア

2

オペレーティングシステム

3

図1.4●ソフトウェアから見たコンピュータの基本構成

4

ソフトウェアは、大きく分けてオペレーティングシステム（OS）とアプリケーションソフトウェアに分類できます。OS は、ハードウェア資源を含め、コンピュータ全体を制御します。アプリ

5

ケーションソフトウェアは、OS とハードウェアの力を借りて、目的とする機能を使用者に提供します。

6

1.2.1 オペレーティングシステム（OS）

7

オペレーティングシステム（OS）は、アプリケーションソフトウェアにハードウェアの違いを意識させないために存在します。また、コンピュータハードウェアならびに複数のアプリケー

8ションの管理を一手に引き受けます。

OS と一口に言っても、メインフレームで使われる米 IBM 社の MVS や、ワークステーション

9から始まり、サーバー、およびモバイル機器までカバーする UNIX（Linux）など、いろいろなものが存在します。ただ、方式は異なりますが、OS の目的は同じです。

10
アプリケーションソフトウェア

11
オペレーティングシステム

12
ハードウェア1314
図1.5●OSはアプリケーションソフトウェアとハードウェアを仲介する

155

1 コンピュータ概論
1.2.2 アプリケーションソフトウェア
アプリケーションソフトウェアは、文章を編集したり給与計算をするといった具体的な目的を実現する機能を使用者に提供します。応用ソフトと呼ばれることもあります。

現代のアプリケーションソフトウェア
少し昔までは、アプリケーションソフトはパソコンショップなどでパッケージに納められて販売されていました。現代においては、ショップなどでパッケージソフトを購入するのは稀でしょう。現在では、ネット上のストアからダウンロードしたり、オープンソースで開発された無償のアプリケーションソフトウェア、そしてクラウド上で使用するアプリケーションソフトウェアが存在し、一昔前のアプリケーションソフトウェアとは異なります。ただし、アプリケーションソフトウェアがバーチャルマシン上で動作していようが、ネイティブに動作していようが、一番の基礎部分には OS が存在します。
パッケージソフトウェアに対応する言葉として、特定の目的に沿って開発を依頼して、カスタムメイドで開発したソフトウェアが存在します。一昔前までは、業務アプリケーションはカスタムメイドのソフトウェアが少なくありませんでした。今では、既存のデータベースソフトやブラウザ、これらとプラグインやサーバーサイドのプログラムを組み合わせ、開発は極一部のスクリプトのみで済ませる場合も少なくありません。開発の形態などが違うだけで、ある目的を達成するために開発されたソフトウェアであるという点は同じです。

1-3 データモデル
1.3 データモデル

計算機（CPU）は、それぞれデータモデルを持っています。データモデルは、当然、プログラムに影響を与えます。特にプログラミング間インタフェース（API）や、ライブラリの呼び出し、そしてアドレスやデータの保持などに大きな影響を与えます。これらは、当然ですが採用されているデータモデルに依存します。

1.3.1 データモデルとは例えば、アドレス（ポインタ）サイズが何バイト必要か、int は、long は、などという疑問です。
これらを抽象化データモデルと呼びます。どのようなデータモデルを採用するかで、データサイズが変わるため、いろいろな処理に影響が発生します。以降に、一般的に使用されている 32

6

1.3

データモデル

ビットシステムのデータモデルと、64 ビットシステムのデータモデルを示します。64 ビットシ

1

ステムでは、異なる抽象化データモデルが採用される場合があります。以降にデータモデルを表で示します。

2

表1.1●システムのビット数と抽象化データモデル
システムビット数

データモデルint（ビット）long（ビット）

アドレス（ビット）

32 ビット

ILP32

32

32

32

64 ビットIL32P64（LLP64）

32

32

64

I32LP64（LP64）

3264

64

ILP64

64

64

64

34
5

32 ビットシステムでは、ILP32 が採用されることが少なくありません。I は int、L は long、Pはポインタを指し、それぞれすべてが 32 ビット、つまり 4 バイトで構成されることを示します。

6

一般的に 32 ビットシステムでは、ILP32 が採用されます。

IL32P64 は、LLP64 と表現される場合もあります。文字通り、IL が 32 ビットで、P が 64 ビッ

7トです。IL32P64 モデルを採用しているシステムの一例が 64 ビットの Windows です。他に、

I32LP64 や ILP64 データモデルが存在します。個人的には I32LP64 もバランスが良い気がする

8のですが、それを採用すると、32 ビットシステムから 64 ビットシステムへ移行する際に、longを使用したコードをすべて調べなければなりません。このため、単にポインタだけに注意すれば9

良い IL32P64 を採用するケースも少なくありません。また、I32LP64 を採用すると、long が64 ビットになるため、不必要にメモリを消費することも考えられます。

101.3.2 データモデルの例

11

すべてのデータモデルを考えるのは大変なので、一例として身近なシステムである Windowsで考えてみましょう。Win32（32 ビットシステム）は ILP32 データモデルを、Win64（64 ビッ12トシステム）は IL32P64 データモデルをそれぞれ採用しています。

13

表1.2●Windows OSのデータモデル
システム

int（ビット）long（ビット） ポインタ（ビット）

32 ビット（win32） ILP32

データモデル3232

3264 ビット（win64） IL32P64

3232

64

1415

32 ビットシステムでは、int、long およびポインタすべてが 32 ビット（4 バイト）です。64 ビッ、ポトシステムでは、IL32P64 データモデルなので、int および long は 32 ビット（4 バイト）7

1 コンピュータ概論
インタのみが 64 ビット（8 バイト）です。言い換えると、ポインタのみに注意を払えば、普通のソフトウェアは簡単に 32 ビットシステムから 64 ビットシステムに移植することができます。

8