GPGPU
[Wikipedia|▼Menu]
□記事を途中から表示しています
[最初から表示]

コンピュータのマザーボードとdGPUを接続するPCI Express規格は、CPU-システムメモリ間やGPU-ビデオメモリ間と比べてはるかに帯域幅が狭く、安易にGPGPUを導入しようとするとデータ転送がボトルネックとなって逆に性能の低下を招いてしまう可能性もありうる[70]。この点に関しては、NVIDIAが開発した独自のインターコネクト技術であるNVLink[71] [72]などの解決策が模索されている。
開発およびチューニングの難しさと移植性

2015年現在、GPGPU対応プログラムの開発環境・APIとして代表的なものはCUDAOpenCL、およびDirectComputeであり、GPGPU黎明期の開発環境に比べればはるかに開発しやすくなっている[73]ものの、依然としてアクセラレーターとなるハードウェアを意識したGPGPU特有のプログラミング知識が不可欠である。また、規格によってある程度標準化・抽象化されているとはいえ、いずれもデバイスとの通信を行なうローレベルのAPIを使いこなさなければならないなど、通常の C/C++Fortran を用いたソフトウェア開発とは次元の異なる難しさがあり、導入のハードルが高い。特に OpenCL と DirectCompute はハードウェアに共通にアクセスできる API を規定しているだけであり、CUDAよりもさらにローレベルの抽象度である。この点に関しては、アクセラレーターの存在を抽象化し、従来のCPUベース並列プログラミング用の共通規格 OpenMP に近い高レベルプログラミング環境を提供する OpenACCC++ AMP といった規格も徐々に整備されつつある[74]

CPU上で動作するプログラムは組み込み環境を除き、ライブラリも含めて高レベルに洗練された開発環境が整っていることが多い。例えばC++JavaC#言語などの代表的な高級言語では、単純な連続メモリの配列構造だけでなく、リンクリスト二分探索木ハッシュテーブルといった基本的なデータ構造はプログラミング言語標準ライブラリで提供されていることがほとんどだが、GPUプログラミングの場合は高速に処理できないという理由から[要出典]基本的には配列構造しか用意されていない。フォトンマッピング手法の開発者であるWann Jensen博士によると、複雑なデータ構造をGPU上で扱おうとするとCPUよりもはるかに困難となる場合が多いと評されている[75]。他にも、GPUプログラミング言語であるHLSLGLSL、およびOpenCL CではC++テンプレートのようなジェネリックプログラミング機能がサポートされないため、生産性が低い。なおBLASFFTに関しては、NVIDIAによるCUDA実装のcuBLAS[76]やcuFFT[77]、およびAMDによるOpenCL実装のclMath (clBLAS, clFFT) [78]が存在する。そのほか、二分探索ソート、リダクション、スキャンといったよく使われるアルゴリズムに関しては、NVIDIAによるCUDA実装のC++テンプレートベース並列アルゴリズムライブラリThrust[79]や、AMDによるOpenCL/C++ AMP実装の同等ライブラリBolt[80]が存在するが、両者に互換性はない。

また、GPUで演算した結果をCPUで読み出して利用する場合、従来アーキテクチャではGPUメモリからCPUメモリへのデータ転送が必要となる。その逆もまた然りである。こうしたCPU-GPU間のメモリ転送にかかる処理時間およびプログラミング上の手間が、性能のボトルネックやソフトウェア開発の難しさにつながるという問題も抱えている。これは物理的にメモリが分離されているdGPUとCPUによる構成だけでなく、従来型のオンボードグラフィックスやCPU内蔵GPUといった、物理メモリを共有する構成においても同様である。CUDA[81]やOpenCL[82]にはソフトウェア(ドライバー)レベルでこの転送の手間を解決する仕組みとして統合メモリ (unified memory) 機能や共有仮想メモリ (shared virtual memory) 機能が用意されてはいるが、あくまでメモリ空間のアドレッシングを仮想化して転送処理を自動化するだけの仕組みであり、アプリケーションプログラマーが明示的に転送処理を記述してチューニング・最適化する場合と比べてパフォーマンス上の問題もある[83]。この点に関しては、AMDが推進しているHSA (Heterogeneous System Architecture)[84] におけるhUMA (heterogeneous Uniform Memory Access) といった解決策が模索されている。

GPGPUプログラムの移植性に関しては、CUDAはNVIDIAハードウェア専用であり、また DirectCompute (DirectX) はMicrosoftプラットフォーム(Microsoft WindowsXbox Oneなど)専用という制約がある。一方でOpenCLは、GPUだけでなく対応するあらゆるハードウェア・あらゆるプラットフォームへ展開できる高い移植性を持っているが、性能に関するポータビリティは必ずしも確保・保証されず、場合によってはデバイスやチップごとにコードをチューニングする必要がある[85][86][87]
適合分野

GPGPUで性能が向上するアプリケーションの例として、下記が挙げられる。

数値計算

シミュレーション

分子動力学法格子ボルツマン法

物理シミュレーション

流体計算気候シミュレーション

天体シミュレーション



暗号解読

暗号通貨の採掘


音声処理

CT再構築

データベース処理

市況分析

機械学習ニューラルネットワークなど行列計算によるもの)

ディープラーニング


最適化問題(DRAMにコアレスアクセスするもの)


次ページ
記事の検索
おまかせリスト
▼オプションを表示
ブックマーク登録
mixiチェック!
Twitterに投稿
オプション/リンク一覧
話題のニュース
列車運行情報
暇つぶしWikipedia

Size:101 KB
出典: フリー百科事典『ウィキペディア(Wikipedia)
担当:undef