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

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

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

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

のヘテロジニアス・コンピューティングでは異なるISAを異なる方法で処理しなければならないことを意味していたが、では例えば、ヘテロジニアス・システム・アーキテクチャ（HSA）システムが存在し、同じ集積回路上などにある複数の種類のプロセッサ（CPUとGPUなどS. Mittal and J. Vetter (2015), A Survey of CPU-GPU Heterogeneous Computing Techniques ACM Computing Surveys）を使用する際の（ユーザーにとっての）違いを解消しながら、両者の長所を提供する：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はその典型例であり、高速で高消費電力なコアと低速で低消費電力コアが組み合わされているA Survey Of Techniques for Architecting and Managing Asymmetric Multicore Processors ACM Computing Surveys 2015年。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++との互換性が考慮されているISO C++ and SYCL Join for the Future of Heterogeneous Programming Codeplay 2020年6月9日。
 CUDAコードをSYCLコードへと変換するツールSYCLomaticもオープンソースとして提供されているSYCLomatic: A New CUDA-to-SYCL Code Migration Tool Intel。
 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が提供されているNVIDIAのCUDAアーキテクチャGPUにおけるFortranサポート。Intel Xe向けにコンパイルするためのZLUDAもあるZLUDA: Drop-In Open-Source CUDA Support For Intel Xe / UHD Graphics Phoronix 2020年11月24日（開発停止中）。
 ヘテロジニアス・コンピューティング向け標準C++ライブラリのlibcu++ (NVIDIA C++ Standard Library) も存在する。libcu++はLLVMのlibc++の派生となっているNVIDIA C++ Standard Library Now Available Via GitHub Phoronix 2020年9月19日。
 HIP (Heterogeneous-Compute Interface for Portability)
 CUDAに近いカーネル言語およびAPI。AMDによるROCm (Radeon Open Compute) プラットフォームの一環として、オープンソースで提供されているROCm-Developer-Tools/HIP: HIP: C++ Heterogeneous-Compute Interface for Portability。実行環境としてAMD GPUに対応しているほか、バックエンドにCUDAコンパイラを利用することで、NVIDIA GPU上で動作可能なCUDAコードを生成することもできる。
 CUDAコードをHIPコードへと変換するツールHIPIFYもオープンソースで提供されているROCm-Developer-Tools/HIPIFY: HIPIFY: Convert CUDA to Portable C++ Code。
 OpenMP (4.0以降)
 OpenMPは4.0以降offloadに対応するようになった。GCC 5以降OpenMP 4.0 Offloading For Intel MIC Lands In GCC 5 Phoronix 2014年11月13日やLLVM/ClangOpenMP Support LLVM projectLLVM 11 Merges AMD Radeon GCN Offloading For OpenMP Phoronix 2020年5月27日などがこれに対応している。
 SPMD Programming Language
 インテルによって開発された、C言語を拡張した対応言語であり、Intel SPMD Program Compiler (ISPC) でコンパイル可能。ISPCはオープンソースであり、バックエンドにLLVMを使用しているIntel SPMD Program Compiler - Overview Intel Corporation。IntelのCPUやXeon Phiだけでなく、NVIDIA Kepler GPUIntel SPMD Program Compiler User's Guide - Compiling For The NVIDIA Kepler GPU Intel CorporationやARMにも対応している。ISPCを導入している例としては、オープンソースのレイトレーシングエンジンであるEmbreeがあるEmbree Overview Intel Corporation。
 DirectCompute
 マイクロソフトが開発・配布しているDirectXテクノロジーのひとつであり、DirectX 11/DirectX 12セットに含まれるGPGPU向けのAPI。GPGPU向けのシェーダーステージとして導入されたDirect3Dコンピュートシェーダー (compute shader) を利用する。HLSLをカーネル記述言語とする。グラフィックス連携用途を重視している後藤弘茂のWeekly海外ニュース。動作環境は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では、まだコンピュートシェーダーに対応しておらず、草案の段階であるWebGL 2.0 Compute。
 Vulkanコンピュートシェーダー
 OpenGLと同様にVulkanにもコンピュートシェーダーがある。シェーダーコードの中間表現にはSPIR-Vが採用されており、オフラインコンパイルが可能。主にGLSLまたはHLSLをカーネル記述言語に使用する。
 Metalコンピュートシェーダー
 AppleはOpenCLを非推奨とし、代替としてMetal APIのコンピュートシェーダーを推奨している。カーネルの記述にはMetal Shading Language (MSL) を用いる。macOS/iOSなどのAppleプラットフォーム上でのみ利用可能。
 OpenACC
 OpenMPのようにコード中にディレクティブを挿入することで、並列処理のハードウェアアクセラレートを行なえるようにする標準規格OpenACC ディレクティブによるプログラミング by PGI Compilersであり、Cray (のちにHPEが買収)、NVIDIA、PGI (のちにNVIDIAが買収)、CAPSがヘテロジニアスシステムに向けて設計した。
 PGIのコンパイラに初めて搭載されOpenACC ディレクティブによるプログラミング by PGI Compilers、その後、GCC 5.0以降にも搭載されているOpenACC Changes Merged Today For GCC 5 Phoronix 2015年1月15日。HPEはCCE (Cray Compiling Environment) 10.0.0以降でOpenACCを非推奨とし、OpenMPを推奨するようになっているOpenACC Use Hewlett Packard Enterprise Development。
 NVIDIAは2020年にOpenACCなどの包括的なサポートを含むHPC SDKを発表したNVIDIA HPC SDK を発表 | NVIDIAHigh Performance Computing (HPC) SDK | NVIDIA。

 過去の技術 
 C++ AMP
 マイクロソフトが策定した、ハードウェアアクセラレートされた並列処理をC++言語で記述できるようにする高レベルのライブラリ・言語拡張。公式の実装としてはDirectComputeをバックエンドとするMicrosoft Visual C++がある。ただしVisual C++ 2022以降では非推奨となったC++ AMP Overview | Microsoft Learn。
 またオープンソースのC++ AMP実装「HCC」も存在したAMDとMS，GPU演算用途向けのコンパイラ「C＋＋ AMP v1.2」を発表 - 4Gamer.netが、その後非推奨となり、CUDA類似のHIP APIをベースとするHIP-Clangに置き換えられたHCC Deprecation Notice AMD。
  (Open Hybrid Multicore Parallel Programming)
 OpenACC同様、ディレクティブベースのヘテロジニアス・コンピューティング向けプログラミング標準。
 OpenMP LEO (Language Extensions for Offload)
 インテルによるIntel MIC (Many Integrated Core) およびGFXへオフロードするためのOpenMP拡張。ICC (Intel C++ Compiler) に実装されていたInitiating an Offload on Intel® Graphics Technology Intel。
 （）
 AMD社によるATI系GPUのストリームプロセッサインターフェイス。ハードウェアに近いローレベル制御を可能とするAMDのGPGPU戦略は新章へ - ATI Streamの展望、DirectX Compute Shaderの衝撃 (2) ATI Streamとは? | マイナビニュース。
 AMD Stream（旧ATI Stream）
 AMDによるATI系GPU用のGPGPU開発・実行環境。CTMをCompute Abstraction Layer（CAL）"Close to the Metal", Justin Hensley, AMD Graphics Product Groupによって抽象化し、Brook言語をCAL用に拡張したBrook+言語による開発を可能にする。
 なおAMDは「GPGPUでDirectX 11およびOpenCLをフルサポートする」と発表しAMD、DirectX 11/OpenCLのGPGPUをフルサポートへ AMD Drives Adoption of Industry Standards in GPGPU Software Development、。
 その後、同社は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によって買収されている。

 脚注 

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

*
Category:コンピュータアーキテクチャ