• 検索結果がありません。

並列処理の背景

N/A
N/A
Protected

Academic year: 2021

シェア "並列処理の背景"

Copied!
40
0
0

読み込み中.... (全文を見る)

全文

(1)

汎用の並列ハードウェア

汎用マルチコアプロセッサ

(2)

インテル汎用CPUのマルチコアの例

• 2005/4 Pentium エクストリームエディション

– 2コア×ハイパースレデッィング ⇒ 4スレッド

• 2006/6 デュアルコアXeon

– サーバー用Xeonでのデュアルコア

• 2006/11 クワッドコアXeon

Xeonでの4コア

• 2007/1 Core2 Quad

• 2010/3 Xeon 7500 8コア×HT⇒16スレッド

• 2011/4 Xeon E7 10コア、2~8ソケット可

• 2013/9 Xeon E5-2600 12コア

• 2014/2 Xeon E7-v2 15コア

• 2014/9 Core i7-5960X 8コアHaswell

• 2014/9 Xeon E5-2600v3 18コア

2 インテル・ミュージアム マイクロプロセッサーの歴史 http://japan.intel.com/contents/museum/hof.html コア自体の向上が目覚 ましいので、単純な コア数の比較は、意味 がないことに注意

(3)

インテル汎用CPUのマルチコアの構造

3 コア コア コア コア L1 L1 L1 L1 L3キャッシュ L2 キャッ シュ L2 キャッ シュ L2 キャッ シュ L2 キャッ シュ CPUチップ コア コア コア コア L1 L1 L1 L1 L3キャッシュ L2 キャッ シュ L2 キャッ シュ L2 キャッ シュ L2 キャッ シュ CPUチップ

メモリ

マザーボード 例えば 256KB 例えば 8MB 例えば 32KBx2

・端末用のCoreではこの他にGPUがチップ上に載っている

・共有メモリのキャッシュ統一性の問題

(4)

GPGPU

4

General Purpose Graphic Processing Unit

(汎用のグラフィックプロセッサ)

従来

GPU

グラフィック演算を高速化する

グラフィック演算は各点・各オブジェクトに対する

同じ処理から成っている

⇒ パイプラインを用いて高速化できる

GP

GPU

パイプラインをメモリ共有の多コアとして構成

グラフィック以外の処理も (←「汎用」)

メモリ共有多コア上で並列実行可能にする

プログラミング環境も提供し、プログラマに開放

(5)

GPGPU(1)

• GPUは一般的に画像処理を専門とする演算装置であり、

CPUの制御の下で用いられる動画信号生成専用の補助演算用ICである。

• 動画像の実生成は演算能力が要求されるが、その多くが定式化された単純

な演算の繰り返しであるためハードウェア化に向いており、高速なメモリ

・インターフェース機能と高い画像演算能力を備えたIC製品のシリーズが

いくつも製造・販売されている。

• 90年代中盤以降は3D描画性能が劇的に向上し、それに伴い行列演算を中

心としたSIMD演算機の色彩が強くなってきた。

2000年代に入ると、表現力の向上を求めて固定機能シェーダからプログ

ラマブルシェーダへの移行が進み、演算の自由度が飛躍的に増した。

これをグラフィック・レンダリングのみならず、他の数値演算にも利用す

るのがGPGPUのコンセプトである。

• GPUの浮動小数点演算能力は2010年頃に2000GFLOPSをオーバーした一

方で、CPUの浮動小数点演算能力は頭打ち状態にあり、2011年時点で数

十GFLOPS台に留まっている。GPUは構成が単純であるために浮動小数点

演算での効率がよく、GPU専用にローカル接続されたメモリICとのメモリ

バンド幅を広く備えるために、CPUと比べて性能比で安価かつ成長の伸び

率が高い。

http://ja.wikipedia.org/wiki/GPGPU

(6)

GPGPU(2)

• GPUはシェーダプロセッサと呼ばれる多数の演算ユニットを持ち、複数

のシェーダプロセッサをまとめてクラスタとしている。

これらの演算器に命令を与えるインストラクション・ユニットはクラス

タごとに1台しか無く、クラスタを構成するシェーダプロセッサはそれ

ぞれ異なるデータを与えられ、そのデータに対して同じ命令内容を一度

に実行する。

• このようなSIMD型データ処理は3次元演算やマルチメディア処理に効

果を発揮する一方で、命令中に条件分岐による分岐が入るとオーバーヘ

ッドがかさみ、途端に効率を落としてしまう。

• また、シェーダプロセッサ間でデータをやりとりする場合、遠くのデー

タバスを経由することになり、それがボトルネックとなってしまう。

http://ja.wikipedia.org/wiki/GPGPU

(7)

GPGPU(3)

• GPUは倍精度の浮動小数点演算が不得意である。GPUが扱う多くの画

像演算では、整数演算や単精度の浮動小数点演算で足りてしまうため

に浮動小数点演算器は仮数部が24ビット程度とそれほど広くなく、倍

精度の浮動小数点演算を行うには分割して幾度も演算器を使う必要が

ある。

• メモリ環境についても、演算入力は少数の格子点データと幾分大きな

テクスチャ・データだけであり、演算出力は画像1枚程度の大きさのピ

クセルごとに3色のデータを保持しながら順次それらを送り出すだけで

済むため、相応に大きな外部の半導体メモリとかなり広いメモリバン

ド幅による接続で十分に対応しており、演算対象データの局所性が高

いのでローカルメモリと内部キャッシュによってデータの読み書き性

能が向上すると同時に演算も途切れずに順次行える傾向が強い。

http://ja.wikipedia.org/wiki/GPGPU

(8)

GPGPU(4)

• 基本的にGPUは、配列構造の単純なデータを単精度程度の浮動小数

点演算によって順番に処理することで2次元の動画像データを実時

間内に生成することに特化しているため、それ以外の用途ではあま

り高い性能は期待できない。画像処理専用ICの流用では、科学技術

計算でも倍精度以上の浮動小数点演算を必要としたり、演算の局所

性が低いものではそれほど高い性能は得られない。画像処理専用で

はなく、GPUから派生して新たに開発されたGPGPU用のICでは、

倍精度浮動小数点演算やより広いメモリ空間に対応したものがあり

、これらは広範な科学技術計算への利用が期待される。

http://ja.wikipedia.org/wiki/GPGPU

(9)

CUDAの概略

• CUDA = NVIDIA GPGPUプログラム開発環境

• ヘテロジニアス (非均一) なハード環境を対象

– ホスト側CPU vs GPGPU側PU(コア)

• 命令体系も違う、置き場所(下記)も違う

– グローバルメモリ vs ローカルメモリ

• 転送が必要になる ⇒ 転送時間がかかる

– でもなるべく一様に (少なくともC/C++言語)

• モジュール (ファイル) 分け、陽にデータ転送指示

– イメージ:転送⇒fork⇒処理⇒join⇒結果転送

• GPGPUハードに密着したランタイムを含む

– スレッドのスケジューリングなど

• GPGPUハードの細かい知識が前提

– 結局パフォーマンス追及したいので、必須

9

(10)

CUDAの概要(NVIDIA資料)

CUDA はハードウェアとソフトウェアを組み合わせたプラットフォームで、C、C++ 、Fortran などさまざまな言語で書かれたプログラムを NVIDIA GPU で実行すること ができます。 CUDA プログラムはカーネルという名前の並列関数を呼び出します。各カーネルは、 複数の並列スレッドによる並列実行となります。 図1に示すように、スレッドをまとめたものをスレッドブロック、スレッドブロックを まとめたものをグリッドと呼び、プログラムやコンパイラではこれらを単位として取 り扱います。スレッドブロックを構成するスレッド1本1本がそれぞれカーネルのイン スタンス一つを実行するのです 各スレッドは自分が属するスレッドブロックおよびグリッドにおけるスレッド ID と ブロック ID を持つほか、プログラムカウンター、レジスタ、スレッド単位のローカ ルメモリ、入力、出力結果を持ちます。 同時並行で処理を行うスレッドのセットがスレッドブロックです。同じスレッドブロ ックに属するスレッドはバリア同期と共有メモリーにより協調して動作します。スレ ッドブロックも自分が属するグリッドにおけるブロック ID を持ちます。 スレッドブロックを行列としてまとめたものがグリッドです。グリッドは全体で一つ のカーネルを実行し、グローバルメモリーからの入力データの読み取り、グローバル メモリーへの出力データの書き出し、依存関係にあるカーネルコールの同期といった 処理を行います。 http://www.nvidia.co.jp/content/apac/pdf/tesla/nvidia-kepler-gk110-architecture-whitepaper-jp.pdf

(11)

CUDAの概要(NVIDIA資料)

CUDA 並列プログラミングモデルでは、レジスタスピルや関数呼び出し、C の自動配列変数など に使うローカルメモリー空間がスレッドごとに確保されます。 スレッドブロックのレベルでは、並列アルゴリズムに必要なスレッド間の通信、データの共有、 結果の共有に使う共有メモリー空間がブロックごとに確保されます。 複数スレッドブロックで構成されるグリッドは、カーネル全体をカバーするグローバルな同期を 行ったあと、グローバルメモリー空間で結果を共有します。 http://www.nvidia.co.jp/content/apac/pdf/tesla/nvidia-kepler-gk110-architecture-whitepaper-jp.pdf

(12)

#define STRIPS 65536*256 /* Number of total strips */ __global__ void Kernel(FLOAT *Result);

FLOAT h_result[THREAD*BLOCK]; int main(int argc, char** argv){ unsigned int timer;

FLOAT pi;

CUT_DEVICE_INIT(argc, argv); FLOAT *d_result;

cudaMalloc((void**) &d_result, sizeof(FLOAT)*THREAD*BLOCK); cudaMemset(d_result, 0, sizeof(FLOAT)*THREAD*BLOCK);

cudaMemcpy(d_result, h_result, sizeof(FLOAT)*THREAD*BLOCK, cudaMemcpyHostToDevice);

dim3 grid(BLOCK, 1, 1); dim3 threads(THREAD, 1, 1);

Kernel<<< grid, threads >>>(d_result);

cudaMemcpy(h_result, d_result, sizeof(FLOAT)*THREAD*BLOCK, cudaMemcpyDeviceToHost);

pi=0.0;

for (int k=0; k<THREAD*BLOCK; k++) { pi += h_result[k];

}

printf(“GPU結果 =%15.12f¥n”,

(pi - (((FLOAT)0.5)/((FLOAT)STRIPS))) * (FLOAT)4.0); cudaFree(d_result);

}

__global__ void Kernel(FLOAT *Result) {

//GPUでの処理

int ix = blockIdx.x*blockDim.x + threadIdx.x; FLOAT tmp = 0.0; for(int k=0; k<(STRIPS/BLOCK/THREAD); k++){ FLOAT x = ((FLOAT)((ix*(STRIPS/BLOCK/THREAD))+k)) / ((FLOAT)STRIPS); tmp += ((FLOAT)sqrt(1.0-x*x)) / ((FLOAT)STRIPS); } d_result[ix] = tmp; }

CUDAのイメージ

区分求積でπ計算の例

ホスト側プログラム GPU側プログラム グローバルメモリ上に結果の 書込み用領域h_resultを用意 GPU側メモリ上に結果の 書込み用領域d_resultを用意し グローバルメモリのh_result をd_resultに転送コピー GPU側プログラムを fork ⇒ 実行 ⇒ join GPU側メモリ上の結果の値 d_resultをグローバルメモリ 上のh_resultに転送コピー ホスト側でそれぞれの GPUの結果を集計 GPU側では、自分の割当て範囲 のストリップの高さを集計し、 d_resultに書き込む 割当て範囲はホストからもらう のではなく、自分のIDと総スト リップ数から計算している

(13)

NVIDIA Titan

(14)

http://www.nvidia.co.jp/object/geforce-gtx-titan-jp.html

(15)

GeForce GTX TITAN (2013)

(16)

Kepler GK110の宣伝文句(1)

• 71億トランジスタ

• 倍精度演算で1テラフロップス以上

• 電力効率向上

– 1ワット当たりパフォーマンスをFermiの3

http://www.nvidia.co.jp/content/apac/pdf/tesla/nvidia-kepler-gk110-architecture-whitepaper-jp.pdf

(17)

Kepler GK110の宣伝文句(2)

• ダイナミック並列処理

– CPUの関与なしで自律的にワークを生成・同期

– 実行中に並列形式・並列度を最適化

• Hyper-Q

– 複数のCPU(コア)から1つのGPUに投げられる

• グリッド管理ユニット(GMU)

– GMUはGPUで実行するグリッドの実行管理をする

(キューイング、優先度管理)

• GPUDirect

– GPU間で(システムメモリを介さず)データ交換で

きる

http://www.nvidia.co.jp/content/apac/pdf/tesla/nvidia-kepler-gk110-architecture-whitepaper-jp.pdf

(18)

仕様の拡張

(19)

チップのブロックダイヤグラム

(20)

(

S

M

X

)

(21)

SMX プロセッシング・コアアーキテクチャ

SMXユニットには、単精度CUDAコアが192個搭載されていて、各コアには完

全パイプライン化された浮動小数点演算ユニットと整数演算ユニットが設け

られています。

GPUの倍精度パフォーマンスを大幅に高めることを目標の一つとして設計さ

れました。また、旧世代 GPU と同じように、超越関数命令(三角関数、対

数関数等)を高速で近似計算できる特殊関数ユニット(SFU)が用意されて

いますが、その数は、Fermi GF110 SM の 8 倍に達します。

SMX では、32 本の並列スレッドをグループ化したワープを単位にスレッド

のスケジューリングを行います。各 SMX にはワープスケジューラが 4 個と

命令ディスパッチ・ユニットが 8 個あり、4 つのワープを並列に発行・実行

することができます。Kepler のクワッド・ワープスケジューラは、4 つのワ

ープを選択し、1 ワープにつき 1 サイクルに独立した命令を2 つ発行できる

のです。Fermi の場合、倍精度命令を他の命令と組み合わせることはできま

せんでしたが、Kepler GK110 では、ロード/ストア命令、テクスチャー命令

、一部の整数命令など、レジスタファイルのリードがない命令とであれば倍

精度命令をペアにすることができます。

http://www.nvidia.co.jp/content/apac/pdf/tesla/nvidia-kepler-gk110-architecture-whitepaper-jp.pdf

(22)

ワープスケジューラ

(23)

SMX プロセッシング・コアアーキテクチャ

GK110 では、1 スレッドからアクセスできるレジスタの数が最大で 255 レジスタと 4 倍に増強されました。1 スレッドあたりで利用できるレジスタの数が増えた結果、 Fermi では多くのレジスタを使用したり、使用可能レジスタ数を超えてしまったコー ドは Kepler ではこの機能によって大きくスピードアップする可能性があります。 パフォーマンスをさらに高めるため、Kepler では、ひとつのワープに属する複数の スレッドでデータを共有できるシャッフル命令が新しく用意されました。いままで、 ひとつのワープに属する複数スレッドでデータを共有するためには、ストア操作とロ ード操作を行って共有メモリー経由でデータを受けわたす必要がありました。新しく 用意されたシャッフル命令では、ひとつのワープに属するスレッドは、同じワープの 他のスレッドから好きな順番で値を読むことができます。 シャッフルでは、ストアからロードまでの操作が 1 ステップで実行されるため、共 有メモリー利用の場合に比較して、大幅にパフォーマンスが向上します。また、スレ ッドブロックあたりに必要とする共有メモリーの量も少なくなります。ワープレベル のデータ交換で共有メモリーを使う必要がなくなるからです。高速フーリエ変換 (FFT)処理を行う場合にはワープ内でデータ共有が必要になるため、シャッフル機能 を使うだけでパフォーマンスが 6%も向上します。 http://www.nvidia.co.jp/content/apac/pdf/tesla/nvidia-kepler-gk110-architecture-whitepaper-jp.pdf

(24)
(25)

メモリサブシステム

各SMX に 64KB のオンチップメモリーが用意されており、これを 48KB の共有メモ リーと16KB の L1 キャッシュ、あるいは、16KB の共有メモリーと 48KB の L1 キ ャッシュに構成することができます。Kepler は、このほか、メモリーを 32KB/32KB という形で共有メモリーと L1 キャッシュに振りわける構成も可能で、 柔軟性がさらに高くなりました。 また、SMX ユニット単位のスループットを高めるため、64b 以上のロード操作で使 用する共有メモリーのバンド幅も、Fermi SM から倍増され、1 コア・クロックごと に 256B となりました。 L1 キャッシュ以外にも、Kepler には、ある関数を処理する間リードオンリーだとわ かっているデータに使う 48KB のデータキャッシュが用意されています。Fermi の 場合、このキャッシュはテクスチャーユニットからしか読むことができませんでした 。Kepler は、テクスチャー処理能力の増強に伴いこのキャッシュの容量を大幅に増 やすとともに、一般的なロード操作でもこのキャッシュに SM から直接アクセスでき るようにしました。 このパスの利用はコンパイラ側で自動的に管理されます。つまり、C99 標準の “const __restrict”キーワードをプログラマーが指定し、特定の値であるとわかって いる変数やデータ構造にアクセスする場合、リードオンリー・データキャッシュ経由 でロードするようにコンパイラがタグをつけるのです。 http://www.nvidia.co.jp/content/apac/pdf/tesla/nvidia-kepler-gk110-architecture-whitepaper-jp.pdf

(26)

メモリサブシステム

Kepler GK110 GPU には、Fermi アーキテクチャの倍にあたる1536KBの

専用 L2 キャッシュが用意されています。L2キャッシュはSMXユニット間

でデータを統合する要のポイントです。全てのロード命令、ストア命令、

テクスチャリクエスト命令をサポートし、GPU内でのデータ共有を高速か

つ効率的に実現します。KeplerのL2 キャッシュはFermiに対してクロッ

クあたりのバンド幅が最大で2倍になっています。

http://www.nvidia.co.jp/content/apac/pdf/tesla/nvidia-kepler-gk110-architecture-whitepaper-jp.pdf

(27)

ダイナミック並列処理

(28)

ダイナミック並列処理

GPU が処理するワークを GPU 自身が生成し、結果を同期し、そのワークのスケジュ ーリングを制御することが可能になり、CPU の関与無しに、これらの一連の作業を GPU 内の専用の高速ハードウェアパスで行うことができます。 Kepler GK110 では、カーネルから別カーネルを起動することがで、必要なストリー ムやイベントを生成したり、追加ワークの処理に必要な依存関係を管理することがホ スト CPUの関与なしに実行できます。 GPU 上で再帰的な実行パターンやデータ依存の実行パターンを生成・最適化するこ とが可能になり、(中略)システムの CPU のワークロードを別のタスクに振り分け たり、よりパフォーマンスの低い CPU を搭載したシステムで同じワークロードを処 理することも出来るようになりました。 ダイナミック並列処理を使うと、並列度が異なる入れ子構造のループ、複数の逐次処 理タスクスレッドの並列処理、または単純な逐次処理コードを GPU に割り当てて、 アプリケーションの並列部分とデータの局所性を共有することもできます。 GPU 側の中間結果に基づいてカーネルが新たなワークを生成できるということは、 GPUのコード上で自律的にワークの負荷バランスを制御できるということで、プログ ラマーは、高い処理能力が要求される部分や、最終結果の導出に最も関係が深い部分 にプロセッシング能力の大半を振り向けることができます。 http://www.nvidia.co.jp/content/apac/pdf/tesla/nvidia-kepler-gk110-architecture-whitepaper-jp.pdf

(29)

ダイナミック並列処理

上図は、グリッドサイズの動的変更を数値シミュレーションに応用した場合の例です 。固定グリッドサイズのシミュレーションでは、ピーク精度を満足するため、シミュ レーション対象範囲の全体にわたって細かすぎるほどの解像度でシミュレーションを 行う必要があります(中央図)。これに対して複数解像度のグリッドでは、局所的な 変動に応じた適切な解像度でシミュレーションを行うことができます〔右図〕。 http://www.nvidia.co.jp/content/apac/pdf/tesla/nvidia-kepler-gk110-architecture-whitepaper-jp.pdf

(30)

Hyper-Q

(31)

Hyper-Q

(32)

グリッド管理ユニット

(33)

GPUDirect

(34)

GPUDirect

• NIC‐GPU 間のダイレクトメモリーアクセス(DMA)。

CPU側でデータのバッファリングを行う必要はありません。

• GPU とネットワーク内の他ノードとの間で、

MPISend/MPIRecv によるデータ転送効率を大幅に高めます

• CPU のバンド幅とレイテンシのボトルネックを解消します。

• サードパーティー製のさまざまなネットワーク機器、キャプ

チャ機器、ストレージ機器で使用可能です。

http://www.nvidia.co.jp/content/apac/pdf/tesla/nvidia-kepler-gk110-architecture-whitepaper-jp.pdf

(35)

Intel Xeon Phi

35 http://www.intel.co.jp/content/www/jp/ja/processors/xeon/xeon-phi-coprocessor-block-diagram.html http://www.intel.co.jp/content/www/jp/ja/processors/xeon/xeon-phi-detail.html https://software.intel.com/en-us/blogs/2014/01/31/ intel-xeon-phi-coprocessor-power-management-configuration-using-the-micsmc-command

(36)

Intel Xeon Phi (Larrabeeから派生)」

• X86互換のコプロセッサを搭載した、並列コンピューティング用

の演算ボード

• 従来のIAアーキテクチャのアプリケーションをそのまま使うこと

ができる

• ホストOSから独立したLinuxベースのOSを動作させることがで

きる。

• 512BitのSIMD命令により、一命令で複数データを処理できる。

• Xeon Phi 5110P (2012年11月13日発表)

Tri-Gateトランジスタを採用(Ivy Bridgeと同じ製造プロセス)

し22nmで製造。X86コアが60基、動作クロックは1.053GHz。

ピーク時の倍精度浮動小数点演算性能は1.011TFLOPS。搭載さ

れるメモリーはGDDR5の8GBで帯域幅は320GB/s

(37)

ヘテロジニアス・マルチプロセッサ

プログラミングモデル

• ヘテロジニアス = 一様でない、異質の

• OpenMPなど ⇒ 一様(ホモジニアス)を仮定

• たとえば「コプロセッサ」co-processor (×子)

• たとえば「親がコへ仕事を投げる」モデル

• 結果としてかなり分かりにくいコードになる

(38)
(39)

粒度 (Granularity)

ハードウェア

ソフトウェア

クロック同期

非同期

非同期

粒度

(40)

具体的な技術

用→

ル→

シストリックアレイ データフローコンピュータ

ラ―

Open

MP

MPI

Pthreadなど

非手続き的な

記述・言語

論理型・宣言型言語 関数型言語 ライブ ラリ 提供 大量データの分散処理 (例:Hadoop) ヘテロジニアス

参照

関連したドキュメント

これらの先行研究はアイデアスケッチを実施 する際の思考について着目しており,アイデア

あれば、その逸脱に対しては N400 が惹起され、 ELAN や P600 は惹起しないと 考えられる。もし、シカの認可処理に統語的処理と意味的処理の両方が関わっ

当初申請時において計画されている(又は基準年度より後の年度において既に実施さ

歴史的にはニュージーランドの災害対応は自然災害から軍事目的のための Civil Defence 要素を含めたものに転換され、さらに自然災害対策に再度転換がなされるといった背景が

委員会の報告書は,現在,上院に提出されている遺体処理法(埋葬・火

  支払の完了していない株式についての配当はその買手にとって非課税とされるべ きである。

1.制度の導入背景について・2ページ 2.報告対象貨物について・・3ページ

使用済自動車に搭載されているエアコンディショナーに冷媒としてフロン類が含まれている かどうかを確認する次の体制を記入してください。 (1又は2に○印をつけてください。 )