ハードウェアアクセラレーション

コンピューティングにおいて、**ハードウェアアクセラレーション** () とは、なんらかの機能を通常の汎用プロセッサ (CPU) 上で動作するソフトウェア（コンピュータプログラム）としての実装で処理したのではレイテンシが大きい、スループットが低い、消費電力が大きい、などといった問題があるような場合に、ハードウェア実装による支援で実行速度などを加速（アクセラレーション）し、システム全体の性能や効率を向上させる技術である。ハードウェアアクセラレーションを利用するにはシステムに専用のプロセッサを追加する必要があるため、コスト高に繋がる可能性がある。

## 概略
ハードウェアアクセラレーションはパフォーマンスを改善するために使用される様々な技術のうちのひとつである。特に並列処理の点で、専用設計されたハードウェアは効果を発揮しやすい。通常、CPUによるソフトウェアの実行では、CPUが備えるプリミティブな命令の並びで処理を実現し、その命令を逐次的にひとつずつ実行する。一方ハードウェアによるアクセラレーションでは特定の処理のための専用のハードウェアを設計し、そのハードウェア内では回路の並列性を生かして演算を並列に行うことで、逐次的な命令実行の場合よりはるかに高速に演算を実行する。しかし専用に設計されたハードウェアとして処理を実現した場合、CPUが備えるプリミティブな命令の組み合わせによりソフトウェアとして処理を実現する場合に比べて柔軟性が減少する。またハードウェアの設計および製造にはソフトウェアに比べて桁違いのコストが必要になる。

このような実行性能と柔軟性やコストとのトレードオフから、ハードウェアによるアクセラレーションはソフトウェアの中でも特定のパターンの演算を集中的に処理するようなパフォーマンス上の重要な部分について利用される。ハードウェアアクセラレーションは小さな機能ユニットからMPEG2の動作予測のように大きな機能ブロックまでさまざまな粒度にわたる。一般に粒度を大きくできれば実行性能が向上する一方、用途が固定化され柔軟性は低下する傾向がある。

## アクセラレータ
処理の高速化を支援するハードウェアを総称して**アクセラレータ**と呼ぶ。代表的なものに、ビットブロック転送機能や3次元コンピュータグラフィックス描画、動画再生支援機能などを含むリアルタイムグラフィックス処理に特化したGPU（かつてはグラフィックアクセラレータと呼ばれていた）、数値演算コプロセッサなどとも呼ばれるFPU、音声などのデジタル信号処理に特化したDSP、ベクトルプロセッサやFPGA等を拡張ボードに実装したもの、などがある。また以前はパーソナルコンピュータにおいて、アップグレードのためCPUを換装するのが一般的でなかったこともあり、オーバードライブプロセッサ等による「CPUの高速化」のためのプロセッサを「CPUアクセラレータ」等と称したこともあった。

またはグラフィックスなどはGPUに機能が分離される一方で、SSEなどのSIMD型拡張命令として、CPU自身がアクセラレータ的な機能を持つ命令を積極的に備えるようにもなってきている。CPUのSIMD型拡張命令を使用する利点としては、メインメモリよりも遠くにあるGPUを用いた場合のような大きなレイテンシが発生しないということが挙げられる（後述するように、CPUとGPUはメモリ空間が統合されていないことが多く、仮にUMAで物理的に同じメインメモリを使用していても直接お互いのデータを読み書きすることはできず、データを転送するコストがかかる）。

CPUを遥かに超える並列演算性能を持つGPUを、グラフィックスだけでなく様々な計算用途に応用する技術をGPGPUと呼ぶが、2010年代以降はGPGPUに対応したGPUアーキテクチャの成熟とAPIの標準化が進んだため、グラフィックス以外のアクセラレータとしてもポピュラーな選択肢になった。GPUはもともと32bit単精度または16bit半精度の浮動小数点演算を得意とするが、機械学習・深層学習向けに8bit整数演算専用命令を備えるプロセッサも登場している。一方、科学技術計算では64bit倍精度浮動小数点数（あるいはそれ以上の精度）が主に必要とされるが、倍精度はゲーミング用途ではほとんど使われず無駄になるため、コンシューマー向けGPUでは倍精度の浮動小数点演算性能は単精度の場合の1/24や1/32程度に抑えられていることが多い。ハーフレートの倍精度（単精度の場合の1/2）に対応しているGPUは主にワークステーション向けやGPGPUサーバー専用製品に限られる。

## 問題点
アクセラレータを搭載しないコンピュータでは、ハードウェアアクセラレーションを利用したソフトウェアを実行することができない。代替としてソフトウェアによる実装をフォールバックソリューションとして用意することもあるが、開発工数やテスト工数も増加する。また、アクセラレータの命令仕様や演算精度の違いから、演算結果がCPUによるソフトウェア処理と異なる場合も問題となる。

また、アクセラレータを操作する処理を記述する際、本来アプリケーションソフトウェアを実現するために本質的ではない、ハードウェアに関する予備知識も必要となる。通例、ハードウェアを抽象化・標準化するDirectX/OpenGL/OpenCLといったアクセラレーション用APIを介することで、ハードウェアの詳細な実装を隠蔽することが多いが、ハードウェアおよびデバイスドライバー層がこれらのAPIをサポートする必要がある。

なお、通例CPUと外部ハードウェアとではメモリ空間が異なることから、外部ハードウェアに処理を委譲する際にデータをメインメモリから外部メモリに転送する必要があったり、逆に外部ハードウェアの処理結果を取得する際にデータを外部メモリからメインメモリに転送（リードバック）する必要があったりするため、プログラムが煩雑となる。AMD APUにおけるHSAのように、CPUと補助プロセッサのメモリ空間を統合することでソフトウェア開発の負担を低減する解決策も提案されている。

## 脚注

## 参考文献

* https://archive.is/20170803030156/https://knowledge.autodesk.com/ja/support/autocad-lt/learn-explore/caas/CloudHelp/cloudhelp/2016/JPN/AutoCAD-LT/files/GUID-A393BC3F-EA9C-4428-AABF-EDABE902874C-htm.html
* https://archive.is/20170807231026/http://qiita.com/harasho2016/items/1d3b3140a77903094dd5
* https://archive.is/20170810050640/http://help.videostudiopro.com/videostudio/v20/main/jp/documentation/index.html%23page/videostudio-x10/h2-hardware-acceleration.html
* https://archive.is/20170802170011/https://dev.mozilla.jp/2011/01/hardware-acceleration/

## 関連項目
* ハードウェア抽象化レイヤー
* GPGPU
* ヘテロジニアス・コンピューティング