ヘテロジニアス・コンピューティング

**ヘテロジニアス・コンピューティング** (heterogeneous computing) は、異なる種類のプロセッサを組み合わせて構築したコンピュータシステム上で演算を行なうことである。用途に応じて適したプロセッサに処理を分担させることによって全体的な効率を高める。

通常、異種的（ヘテロジニアス）なプロセッサ環境では異なる複数の命令セットアーキテクチャ (ISA) を使用する。また、副プロセッサは主プロセッサとは大きく異なるアーキテクチャである。それゆえ、ヘテロジニアス環境向けソフトウェアの開発・実装は異種プロセッサ間の連携で工夫が必要になるなどして難易度が高くなる。

## 異種性
一般的にコンピューティングの文脈において異なる命令セットアーキテクチャ (ISA) のことを言及する「異種性」とは、単に異なるマイクロアーキテクチャを持つのではなく（例えば浮動小数点の数値処理はこの特殊例であり異種性と呼ばれることは稀）、メインプロセッサがあるアーキテクチャを持ち、他のプロセッサが別の（普通は非常に異なり、複数の場合もある）アーキテクチャを持つ、ということを意味する。

のヘテロジニアス・コンピューティングでは異なるISAを異なる方法で処理しなければならないことを意味していたが、では例えば、ヘテロジニアス・システム・アーキテクチャ（HSA）システムが存在し、同じ集積回路上などにある複数の種類のプロセッサ（CPUとGPUなど）を使用する際の（ユーザーにとっての）違いを解消しながら、両者の長所を提供する：CPUでオペレーティングシステムを走らせて従来の直列タスクを実行しながら、汎用GPU処理を行うなど（GPUはよく知られる3Dグラフィックスレンダリングの他に、非常に大きなデータセットに対する数学的に集中された計算を行うことができる）。

モダンなコンピューティングシステムでは製造技術の向上によって以前の個別部品がシステム・オン・チップ (SoC) へと統合されるようになり、異種性のレベルが次第に高まっている。例えば多くの新しいプロセッサには他のデバイス（SATA、PCI、イーサネット、USB、RFID、無線、UART、メモリコントローラ）と接続するための組み込み回路が含まれているほか、プログラマブル機能ユニットやハードウェアアクセラレータ（GPU、暗号コプロセッサ、プログラマブルネットワークプロセッサ、A/Vエンコーダ/デコーダなど）も搭載されている。

の研究では、複数のISAにより提供される多様性を利用したヘテロジニアスISAチップのマルチプロセッサが、一番良い同一ISAホモジニアスのアーキテクチャを21%も上回り、23%の省エネと32%の削減が可能であることを示している。AMDが2014年に発表したピン互換のARM / x86 SoC、コードネーム「Project Skybridge」は、ヘテロジニアスISA（ARM+x86）チップのマルチプロセッサが製作中であることを示唆している。

### 異種CPUトポロジー
**異種CPUトポロジー**のシステムは同一ISAを使用するものの、コア自体が異なった速度のものとなっているシステムのことである。この構成はどちらかというと対称型マルチプロセッサに似ている（このようなシステムは技術的にはに当たるものの、コアの役割やデバイスアクセスには違いが存在しない）。

このようなトポロジーの一般的な使用はモバイルSoCの電力効率を向上させることにある。ARMのbig.LITTLEはその典型例であり、高速で高消費電力なコアと低速で低消費電力コアが組み合わされている。A10以降のApple Siliconも同様の構成のARMコアで作られている。x86ではAMDのZen4, Zen4cやIntelのAlder Lakeがこれに該当する。

## プラットフォームの例
ヘテロジニアス・コンピューティングのプラットフォームは、ハイエンドサーバーと高性能計算機から携帯電話やタブレット用の低消費電力の素子まで、あらゆる領域で使用される。SoCによる実装以外にも、例えばCPUとGPUを搭載した汎用コンピュータはヘテロジニアス・コンピューティング環境であると言える。たとえSoCであっても、異種プロセッサのメモリ空間が統合されているものもあれば、統合されていないものもある。

* 高性能計算
** Cray XD1
** SRC コンピュータ SRC-6 と SRC-7
* 組み込みシステム (DSP とモバイルプラットフォーム)
** テキサス・インスツルメンツ OMAP
** アナログ・デバイセズ Blackfin
** NVIDIA Tegra
** Samsung Exynos
** Apple "A" シリーズ
* 再構築可能計算
** Xilinx Platform FPGAs (Virtex-II Pro, Virtex 4 FX, Virtex 5 FXT) とZynqプラットフォーム
** Intel "Stellarton" (Atom + アルテラ FPGA)
* ネットワーク
** Intel IXP ネットワークプロセッサ
**  NFP ネットワークプロセッサ
* パーソナルコンピュータ向け汎用プロセッサ
** AMD APU
** IntelのGPU内蔵CPU
** Apple M1 - Macに搭載
* その他 (ゲーム専用機など)
** IBMのCell Broadband Engine - PlayStation 3に搭載
*** SpursEngine - IBM Cellプロセッサの派生型

## プログラミング環境の例
副プロセッサ (ゲスト) をストリーム・プロセッシングで使うものや、主プロセッサ (ホスト) と副プロセッサ (ゲスト) の密な連携が可能なものが存在する。黎明期は独自の専用プログラミング言語を利用するなど、実験的なプログラミング環境が多数出現したが、普及が進むにつれ、標準C/C++あるいはその独自拡張が第1級言語として選ばれることが多くなっている。

ハードウェアや技術によって抽象化のレベルや関数ポインタあるいは仮想関数の使用可否、ホストとゲスト間のUnified Shared Memory (USM) やヘテロジニアス・ユニフォームメモリアクセス (hUMA) への対応などが異なっている。

### 現行の技術
; OpenCL
: Khronos Groupが管理・策定している並列コンピューティングのためのクロスプラットフォームなAPI仕様。
: 派生規格として、Webブラウザ上でヘテロジニアス・コンピューティングを行なうためのWebCLも標準として策定されているが、2021年3月現在、ネイティブに対応しているブラウザは存在しない。
: 当初Appleを中心に提唱されたが、その後Appleプラットフォームでは非推奨となった。
; SYCL
: Khronos Groupが管理・策定しているヘテロジニアス・コンピューティング向けの抽象化レイヤー。OpenCLだけでなく、他のバックエンドにも対応する。IntelのCPU/GPU/FPGA開発環境であるの中心にもなっている。ISO C++との互換性が考慮されている。
: CUDAコードをSYCLコードへと変換するツールSYCLomaticもオープンソースとして提供されている。
; CUDA (Compute Unified Device Architecture)
: NVIDIAによるGeForce / Quadro / Tesla / TegraシリーズGPU用のGPGPU開発・実行環境。C言語を拡張したCUDA Cによる開発を可能にする（Ver.2.2以降はC++言語を拡張したCUDA C++による開発も可能となっている）。NVIDIAによるコンパイラ実装*nvcc*だけでなく、オープンソースコンパイラのLLVMでもCUDAコンパイラの実装が始まっている。また、PGI社からはCUDA Fortran Compilerが提供されている。Intel Xe向けにコンパイルするためのZLUDAもある（開発停止中）。
: ヘテロジニアス・コンピューティング向け標準C++ライブラリのlibcu++ (NVIDIA C++ Standard Library) も存在する。libcu++はLLVMのlibc++の派生となっている。
; HIP (Heterogeneous-Compute Interface for Portability)
: CUDAに近いカーネル言語およびAPI。AMDによるROCm (Radeon Open Compute) プラットフォームの一環として、オープンソースで提供されている。実行環境としてAMD GPUに対応しているほか、バックエンドにCUDAコンパイラを利用することで、NVIDIA GPU上で動作可能なCUDAコードを生成することもできる。
: CUDAコードをHIPコードへと変換するツールHIPIFYもオープンソースで提供されている。
; OpenMP (4.0以降)
: OpenMPは4.0以降offloadに対応するようになった。GCC 5以降やLLVM/Clangなどがこれに対応している。
; SPMD Programming Language
: インテルによって開発された、C言語を拡張した対応言語であり、Intel SPMD Program Compiler (ISPC) でコンパイル可能。ISPCはオープンソースであり、バックエンドにLLVMを使用している。IntelのCPUやXeon Phiだけでなく、NVIDIA Kepler GPUやARMにも対応している。ISPCを導入している例としては、オープンソースのレイトレーシングエンジンであるEmbreeがある。
; DirectCompute
: マイクロソフトが開発・配布しているDirectXテクノロジーのひとつであり、DirectX 11/DirectX 12セットに含まれるGPGPU向けのAPI。GPGPU向けのシェーダーステージとして導入されたDirect3Dコンピュートシェーダー (compute shader) を利用する。HLSLをカーネル記述言語とする。グラフィックス連携用途を重視している。動作環境はWindows Vista以降のWindowsプラットフォームおよびXbox One以降のXboxプラットフォーム。
; OpenGLコンピュートシェーダー
: DirectXに搭載されている前述のコンピュートシェーダー同様、OpenGLでもバージョン4.3でGPGPU向けのシェーダーステージが標準化された。GLSLをカーネル記述言語とする。バージョン4.6のGL_ARB_gl_spirv拡張によりSPIR-V中間表現に対応した。
: OpenGL ESではバージョン3.1で導入された。
: Webブラウザ向けのOpenGL ES派生規格であるWebGLでは、まだコンピュートシェーダーに対応しておらず、草案の段階である。
; Vulkanコンピュートシェーダー
: OpenGLと同様にVulkanにもコンピュートシェーダーがある。シェーダーコードの中間表現にはSPIR-Vが採用されており、オフラインコンパイルが可能。主にGLSLまたはHLSLをカーネル記述言語に使用する。
; Metalコンピュートシェーダー
: AppleはOpenCLを非推奨とし、代替としてMetal APIのコンピュートシェーダーを推奨している。カーネルの記述にはMetal Shading Language (MSL) を用いる。macOS/iOSなどのAppleプラットフォーム上でのみ利用可能。
; OpenACC
: OpenMPのようにコード中にディレクティブを挿入することで、並列処理のハードウェアアクセラレートを行なえるようにする標準規格であり、Cray (のちにHPEが買収)、NVIDIA、PGI (のちにNVIDIAが買収)、CAPSがヘテロジニアスシステムに向けて設計した。
: PGIのコンパイラに初めて搭載され、その後、GCC 5.0以降にも搭載されている。HPEはCCE (Cray Compiling Environment) 10.0.0以降でOpenACCを非推奨とし、OpenMPを推奨するようになっている。
: NVIDIAは2020年にOpenACCなどの包括的なサポートを含むHPC SDKを発表した。

### 過去の技術
; C++ AMP
: マイクロソフトが策定した、ハードウェアアクセラレートされた並列処理をC++言語で記述できるようにする高レベルのライブラリ・言語拡張。公式の実装としてはDirectComputeをバックエンドとするMicrosoft Visual C++がある。ただしVisual C++ 2022以降では非推奨となった。
: またオープンソースのC++ AMP実装「HCC」も存在したが、その後非推奨となり、CUDA類似のHIP APIをベースとするHIP-Clangに置き換えられた。
;  (Open Hybrid Multicore Parallel Programming)
: OpenACC同様、ディレクティブベースのヘテロジニアス・コンピューティング向けプログラミング標準。
; OpenMP LEO (Language Extensions for Offload)
: インテルによるIntel MIC (Many Integrated Core) およびGFXへオフロードするためのOpenMP拡張。ICC (Intel C++ Compiler) に実装されていた。
; （）
: AMD社によるATI系GPUのストリームプロセッサインターフェイス。ハードウェアに近いローレベル制御を可能とする。
; AMD Stream（旧ATI Stream）
: AMDによるATI系GPU用のGPGPU開発・実行環境。CTMをCompute Abstraction Layer（CAL）によって抽象化し、Brook言語をCAL用に拡張したBrook+言語による開発を可能にする。
: なおAMDは「GPGPUでDirectX 11およびOpenCLをフルサポートする」と発表し 、。
: その後、同社はHSA推進とともに、独自規格ではなくOpenCLをヘテロジニアス戦略の中核とする方向に舵を切り直した。AMDによるCPU/GPU/APU対応の総合基盤テクノロジーは「AMD Accelerated Parallel Processing」（AMD APP）と呼ばれており、SDKの名称もATI Stream SDKからAMD APP SDKに変更・統一されたが、その後AMD APP SDKは廃止され、GPUコンピューティングの技術基盤はオープンソースのROCmプラットフォームに移行されることになった。
;  (libsh)
: ウォータールー大学コンピュータグラフィックス研究室の成果に基づいた、RapidMindによるシェーダープログラミングおよびGPGPUのためのメタプログラミング技術。C++言語による開発を可能にする。LGPLライセンスで公開されている。
; RapidMind
: による商用並列コンピューティング開発環境。GPU／マルチコアCPU／Cellプロセッサをバックエンドに利用できる。C++言語による開発を可能にする。
;  (Brook for GPU)
: スタンフォード大学コンピュータグラフィックス研究室によるストリーム・コンピューティング開発環境。GPUおよびOpenMPによるマルチコアCPU演算をバックエンドに利用できる。C言語 (ANSI C) を拡張したBrook言語による開発を可能にする。BSDライセンスおよびGPLライセンスで公開されている。
; PeakStream
: PeakStreamによる商用ストリーム・コンピューティング開発環境。GPU / マルチコアCPU / Cellプロセッサをバックエンドに利用できる。PeakStreamは2007年6月頃までにGoogleによって買収されている。

## 脚注

## 関連項目
* ヘテロジニアスマルチコア