GPUから派生した分野特化型のプロセッサとして、ディープラーニングなどのAI計算能力に対して既存のGPUでは消費電力の大きさが問題になることから、計算精度を8ビットに抑えて、積和演算に特化したTPU(テンソル・プロセッシング・ユニット)というプロセッサが実現されており、人工知能のアクセラレーターとして活用されている[52]。バッテリー駆動が基本となるスマートフォンのSoCにも電力効率向上の必要性からAIアクセラレータが搭載されている。 DirectX 11対応となるEvergreen世代以降のAMD GPU、およびFermi世代以降のNVIDIA GPUでは、浮動小数点の演算精度はIEEE 754規格に準拠したものとなっている。なおNVIDIA GPUおよびAMD GPUでは融合積和演算命令 (FMA) をサポートしているが、CPUで同じ内容の処理をFMAを使わず実行した場合と比べて、GPUによる演算結果が異なることもある[53] [54] [55] [56] [57]。 この節は検証可能な参考文献や出典が全く示されていないか、不十分です。出典を追加して記事の信頼性向上にご協力ください。(このテンプレートの使い方)
IEEE 754サポートおよびFMA命令
メモリ
出典検索?: "GPGPU"
この節は大言壮語的な記述になっています。Wikipedia:大言壮語をしないを参考に修正して下さい。(2015年3月)
この節は言葉を濁した曖昧な記述になっています。Wikipedia:言葉を濁さないおよびWikipedia:避けたい言葉を参考に修正してください。(2015年3月)
メモリ環境についても、演算入力は少数の格子点データと幾分大きなテクスチャ・データだけであり[疑問点 – ノート]、演算出力は画像1枚程度の大きさのピクセルごとに3色[疑問点 – ノート]のデータを保持しながら順次それらを送り出すだけで済むため、相応に大きな[疑問点 – ノート]外部の半導体メモリ(グラフィックスメモリ/ビデオメモリ/デバイスメモリ/VRAM)とかなり広い[疑問点 – ノート]メモリバンド幅による接続で十分に対応しており、演算対象データの局所性が高いのでグラフィックスメモリと内部キャッシュによってデータの読み書き性能が向上すると同時に演算も途切れずに順次行える傾向が強い。
基本的にGPUは、配列構造の単純なデータを半精度/単精度程度の浮動小数点演算によって順番に処理することで2次元の動画像データを実時間内に生成することに特化しているため、それ以外の用途ではあまり高い性能は期待できない。リアルタイム画像処理専用ICの流用では、科学技術計算でも倍精度以上の浮動小数点演算(拡張倍精度・四倍精度など)を必要とするものや、演算の局所性が低いものではそれほど高い性能は得られない。リアルタイム画像処理専用ではなく、GPUから派生して新たに開発されたGPGPU用のICでは、倍精度浮動小数点演算やより広いメモリ空間に対応したものがあり、これらは広範な科学技術計算への利用が期待される。なお、コンシューマー向けの画像処理分野ではほとんど必要とされないメモリの冗長機構であるECCがHPC分野では必須とされるため、ICを共用する場合に制約となる[58]。 GPUによるVRAMへのアクセスは、複数のプロセッサ群によって並列的に発生するため、連続したメモリ領域に対するコアレスアクセス(coalesce access、≒シーケンシャルアクセス)を行なうことで効率化・高速化できる[59]。NVIDIA GPUでは32のハードウェアスレッドを束ねるバッチ単位をWarp[60]と呼び、AMD GPUでは64のハードウェアスレッドを束ねるバッチ単位をWavefront[61]と呼んでいるが、これらのユニット内ではプロセッサが完全に同期して動作するため、バッチ単位ごとにまとめて連続領域にアクセス(コアレスアクセス)することで効率が良くなる。逆に言えば、バッチ単位内のスレッドがそれぞれ遠く離れたばらばらのアドレスにアクセスするような非コアレスアクセス(≒ランダムアクセス)は効率が悪くなる。 GPGPUの本質は、大量の演算器によって実現されるハードウェアマルチスレッド集合を用いたデータ並列演算により性能を稼ぐ点にある。例えばNVIDIA GPUのFermi/Keplerマイクロアーキテクチャでは、演算器の最小単位をCUDAコア (SP, streaming processor) と呼び、また複数のCUDAコアを束ねる単位をSMX (SM, streaming multiprocessor) と呼んでいるが、GPUでの演算は、複数のSMXに対して同一の命令を発行していき、各々のハードウェアスレッドに割り当てられたデータに対して並列的に演算を行なうスタイルとなる[31]。またWarp単位内における各スレッドはすべて同一の命令を実行する(SIMT
共有メモリ
しかし、このGPGPUプログラミングが特に従来型のCPUプログラミングと異なる点は、共有メモリ(shared memory、シェアードメモリ)の存在である。共有メモリは小容量だが高速で、ユーザープログラマーが明示的に管理できるキャッシュメモリ(≒L1キャッシュ)の仕組みを果たし、複数のコアでデータを共有・交換する目的に使用できる。なお各APIにおいては、CUDAは共有メモリ、OpenCLはローカルメモリ、DirectComputeはグループ共有メモリ[63]、そしてC++ AMPはタイル静的メモリ[64]という名称で、それぞれ同等機能を備えている。
例えばFermi/Keplerマイクロアーキテクチャでは、1SMXあたり最大48KBの共有メモリを使用できるが[65]、外部にあるDRAMにキャッシュなしでアクセスする場合と比べて、共有メモリのレイテンシは(スレッド間のバンクコンフリクトがないかぎり)100倍小さくなる。