• トップ
  • G-DEPについて
  • ご購入ガイド
  • サポート
  • お問い合わせ

G-DEPトップ  >  第5回 GPUの構造

第5回 GPUの構造

第5回 「GPUの構造」 

<< 第4回   |   目次に戻る   |   第6回 >>

 さて、今回はGPUの構造についてお話します。

 え、またGPUの話をするの?と思った方、少しだけ待ってください。

 GPUコンピューティングをマスターするためには、グラフィックボードおよびGPUチップの構造、メモリの種類と役割、伝送速度等についてしっかり知っておかなければなりません。それらを知った上で適切にプログラミングすることで、さらに演算を高速化させることができるためです。

 

5.1 グラフィックボードの構造

まずはグラフィックボードの説明です。

 
 以前にもお話しましたが、グラフィックボードは元々画像処理を担当するアクセラレータとして開発され、現在ではゲームや画像処理、3DCADなどはもちろん、GPGPUとして科学技術計算には欠かせないパーツとなっています。
 
主要部品として
  • 基板
  • GPUチップ
  • DRAM(Dynamic Random Access Memory)
  • 画面出力端子(DVI、HDMIなど)
  • 電源入力部(6pin、8pin)
  • 冷却装置(ヒートシンク・ファン)

などから構成されています。

 製品によってはSLIと呼ばれる技術によりPC内に複数個取り付けて扱うことも可能で、かつ最近ではグラフィックボードにGPUチップが2個付いた製品も発売されています。

 詳細は後述しますが、グラフィックボードには何種類かのメモリがあり、それぞれ特徴を持っています。大別すれば、GPUチップ上にあるもの(オンチップメモリ)と、GPUチップ外の基板上のDRAMにあるもの(オフチップメモリがあります。

 

5.2 GPU(チップ)の構造

GPUのチップとはグラフィックボードにおける計算の中枢となる部分です。

2011年9月12日 NVIDIA Partnership Training 講演資料より

上のイメージでは現在の世代「Fermi(フェルミ)」におけるGPUチップのアーキテクチャを示しています。

下のイメージはチップ構造の簡略図です。

「NVIDIAの次世代CUDA™コンピュートアーキテクチャ:Fermi」  NVIDIA White Paper より
 
○ストリーミングマルチプロセッサ(略称SM
 チップ上には幾つものストリーミングマルチプロセッサ(SM)と呼ばれる演算部が搭載されており、またデータのやり取りをこ行うためのメモリやキャッシュが置かれています。この数は製品によって異なりますが、例えばTesla M2090では16個搭載されています。
 
○CUDAコア
 ストリーミングマルチプロセッサはCUDAコア(旧称:ストリーミングプロセッサ(SP))と呼ばれる演算装置と、シェアードメモリやレジスタといったメモリなどで構成されています。CUDAコアは計算を行う部位の最小単位と言えます。一つのSMに入っているCUDAコアの数は世代によって異なりますが、Fermiでは32個のCUDAコアが入っています。そのため、例えばTesla M2090では32×16 = 512(個)のCUDAコアが搭載されていることになります。
 
○メモリアクセス速度
 メモリGPUとビデオメモリは「メモリインターフェース」で接続されており、CPU~メインメモリ間よりも数倍大きなメモリバンド幅で接続されているため、その分高速に伝送することができます。スパコンの開発においては伝送速度(アクセス速度)がボトルネックになっており、それを如何に高速化するかということにも重きを置かれています。その点、「メモリバンド幅」が大きく、CPUよりも高速でメモリにアクセスできることもGPUの優秀な部分として挙げられます。

 余談ですが、Teslaシリーズの製品別の比較表を置いておきます。

2011年9月12日 NVIDIA Partnership Training 講演資料より
 
 
5.3 メモリの種類

グラフィックボードにおけるメモリの種類はハードとしては主に4つあります。

  • DRAM(基板上)
  • L2キャッシュ(GPUチップ内にあり、各SM間で共有)
  • L1キャッシュ+シェアードメモリ(SM内にあり、各CUDAコア間で共有)
  • レジスタ(CUDAコア直近)

概念の流れとしては

【上位】 DRAM→L2キャッシュ→L1キャッシュ+シェアードメモリ→レジスタ 【下位】

の順に小さくなり、キャッシュされてデータが使われます。

さらに機能ごとに、以下のように幾つかの名称と共に役割があり、それぞれアクセス速度や容量は異なります。

  • レジスタ
  • シェアードメモリL1キャッシュ
  • グローバルメモリ(DRAM)
  • ローカルメモリ(DRAM)
  • テクスチャメモリ(DRAM、読み込み専用)
  • コンスタントメモリ(DRAM、読み込み専用)
メモリの配置関係と、アクセス経路です。(枠の大きさと実際の容量は関係ありません)
 
 各メモリの特徴をまとめると以下のようになります。
【アクセス速度】(速→遅) 
レジスタ、シェアードメモリ >> ローカルメモリ、グローバル
【容量】(大→小)
グローバルメモリ >> ローカルメモリ >> ローカルメモリ、レジスタ
【置かれている場所】
GPUチップ(オンチップ)…レジスタ・シェアードメモリ
DRAM(オフチップ)…グローバルメモリ・ローカルメモリ・テクスチャメモリ・コンスタントメモリ
 
 
このようなメモリの特徴を踏まえてプログラミングをすることが大変重要です。
特に、グローバルメモリは容量が大きい分、アクセス速度が遅いため、効率よく計算させるためにはアクセス方法を工夫することが必要になってきます。
 
初めての方はここまで理解すれば十分ですが、もう少し知りたいという方のために詳細を書いておきます。
ここで出てくるクロックサイクルスレッドなどといった用語は後のコラムで説明していきます。
 
 
○レジスタ 「CUDAコアに最も近いメモリ」
 CUDAコアに一番近い所に置かれているため、最も高速にアクセスできるメモリです。4Byte単位で構成されており、カーネル関数で使用する変数のための領域として利用します。スレッドごとに独立した領域を持ち、共有はできません。
 
○シェアードメモリ 「SM内の共有メモリ」
 SM内に置かれているメモリで、L1キャッシュと合わせて64KBの容量があります。プログラム上からの設定で、容量の比率を
シェアードメモリ 16KB、L1キャッシュ 48KB
or
シェアードメモリ 48KB、L1キャッシュ 16KB
と切り替えることができます。レジスタほどではありませんが、高速にアクセスできるメモリです。同一SM内のスレッド間でのデータのやり取りに使用します。
 
○グローバルメモリ 「GPUの主メモリ」
 GPU上ではなくDRAMに置かれているメモリ領域です。CUDAコアから離れいているため、400~600クロックサイクルのレイテンシがあり、レジスタやシェアードメモリと比較して容量ですが低速です。すべてのスレッドからデータを読み書きできます。
 
○ローカルメモリ 「一時メモリ」
 レジスタに収まりきらなかったデータを一時的に格納しておくためのメモリ領域です。グローバルメモリと同じくDRAM上に置かれています。Fermi以降のアーキテクチャではキャッシュが効くため、速度的なペナルティをそれほど気にする必要はありません。
 
○テクスチャメモリ 「読み込み専用のテクスチャ用メモリ」:」@lれるメモリです。グローバルメモリをバインドすることでテクスチャメモリとして使用します。テクスチャユニットを備えており、近傍要素の線形補間などができます。また、専用のキャッシュも持っています。
 
○コンスタントメモリ 「定数メモリ」
 テクスチャメモリ同様、読み込み専用のメモリ(64KB)です。カーネルプログラムの引数や定数を格納するために使用します。専用のキャッシュを持っており、グローバルメモリよりも高速にアクセスできます。

※謝辞:メモリの種類ついてはプロメテック・ソフトウェア株式会社技術部の北岡伸也様よりご指南頂きました。この場を借りて御礼申し上げます。

 

 まだイメージがつかめないという方のために、オフィスに当てはめて説明してみましょう。

 会社全体をグラフィックボード、オフィス部屋内をGPUチップとし、部屋内には営業部や管理部など幾つかの部署ごとに机の島が並んでいるとします。

 

  • SM→各部署
  • CUDAコア→個人の作業机
  • レジスタ→個人の机の引き出し
  • シェアードメモリ→部署ごとのラックやロッカーなど
  • ローカルメモリ→部屋の外にある個人用ロッカー
  • グローバルメモリ→部屋の外にある大きな倉庫

 

 メモリの役割を完全にトレースしてるわけではありませんが、それぞれで保管できる資料の量と、それを手に取る・置きに行くまでの短さを考えてもらうと少しイメージし易くなるかもしれません。

 

5.4 NVIDIA GPUのアーキテクチャ

 ここでNVIDIA GPUのアーキテクチャ世代について軽く触れておきます。

 現在NVIDIAから発売されているGPUの内、最新の世代が「Fermi(フェルミ)」です。
(前の世代は「Tesla(テスラ)」←ブランド名と同じですが、ここではアーキテクチャ名)

Fermiの特徴としては以下のようなことが挙げられます。(NVIDIA資料より)

今は特に理解できなくても構いません。何となくこんなものが導入されたんだな、と頭の隅に置いてもらえれば大丈夫です。

  • 30億個のトランジスタ
  • CUDAコア数を倍増(512コア)
  • 倍精度浮動小数点演算ピーク性能が8倍
  • GPUとして初めてECCを導入(エラーチェック機能)
  • L1,L2キャッシュを内蔵
  • 約2倍のメモリーバンド幅(GDDR5)
  • 最大1TBのGPUメモリ
  • 複数Kernelの同時実行、C++サポート

 現在の世界最速のスパコンの性能はペタスケールですが、NVIDIA社は次世代に向けた「エクサスケール」のスパコンへのGPUの適用を目指しています。しかし、今の技術でエクサスケールを達成しようとすると約50万世帯分(600MW)とも言われる膨大な消費電力がかかってしまうため、性能/消費電力を如何に上げるかに鎬を削っています。

 実際には、Fermiの次の世代として「Kepler(ケプラー)」、そのまた次の世代として「Maxwell(マクスウェル)」と呼ばれるコードネームで開発が進められています。性能/消費電力についてはKeplerではFermiの3倍、MaxwellはKeplerのさらに3倍となることを目指しているそうです。

2011年9月12日 NVIDIA Partnership Training 講演資料より

 これらは、2011年に行われたGTCセッションの基調講演で、NVIDIA CEOが掲げたNVIDIAロードマップによるものです。詳しく知りたい方はGTCセッションのレポートがありますので、下の参考ページの高速演算記第4回もゼヒご覧になってください。

 

第5回はGPUの構造と題して、その詳細な構造に迫ってみました。

まとめ
  • CUDAコア(最小単位)<SM<GPUチップ<グラフィックボード(<マザーボード<PC)
  • GPUには色々なメモリが搭載されている。(オフチップとオンチップ)
  • 計算パフォーマンスを上げるには各メモリの特徴を理解し、アクセス速度を工夫するプログラミングが重要。
  • GPUの開発は対消費電力性能と、メモリアクセス速度の向上に注力している。

 

それでは次回はCUDAのプログラミングモデルについてと、それがどうGPUの構造と関係してくるのかを絡めながら勉強していきたいと思います。
 

<謝辞>
本コンテンツにおいて、NVIDIA社より資料の引用を快諾頂きました。ここに記して謝意を表します。

 

 

<< 第4回   |   目次に戻る   |   第6回 >>


【参考ページ】(新しいウィンドウで開きます)

高速演算記 第4回「GTCレポートその1 NVIDIA CEOによる基調講演」(当サイトコラム「高速演算記」)

RAMの種類 (初心者のためのパソコンHP)

(執筆 G-DEP Associate Research Engineer 東京大学大学院工学系研究科 岡安優)