ユニファイドメモリアーキテクチャ(UMA)とは
ユニファイドメモリアーキテクチャ(Unified Memory Architecture, UMA)は、
CPUだけでなくGPUなどの他のデバイスもメインメモリを共有して使用するメモリアーキテクチャです。この方式は、システム全体のメモリ利用効率を高め、コスト削減にも貢献します。
歴史
UMAの初期の例として、1980年代のNECのPC-8001が挙げられます。このシステムでは、メインメモリの一部をビデオメモリ(
VRAM)として利用し、画面表示を行っていました。当時は、DMA転送中に
CPUがメモリバスの使用権を失い、
CPU性能を十分に発揮できないという課題がありました。そのため、計算処理時はDMAを停止し、
CPUがフルにメモリへアクセスできるようにする必要がありました。
その後、
PC-8800シリーズなどでも同様の手法が使われましたが、
CPUの性能向上が進むにつれて、UMAは
CPU性能を制限する要因として敬遠されるようになりました。しかし、メモリの価格低下やモジュール増設の容易化が進むにつれて、再び注目されるようになりました。
UMAの適用
現代では、UMAは主にメインメモリを
VRAMとして利用する場合に用いられます。特に、エントリーモデルのデスクトップPCやノートPC、
スマートフォン、タブレット、ゲーム機などのSoC(System-on-a-Chip)で広く採用されています。これらのデバイスでは、独立したグラフィックスボードを搭載せず、オンボードグラフィックスや
CPU内蔵のGPUでグラフィックス処理を行います。
メリット
コスト削減: グラフィックス専用のメモリが不要になるため、システム全体のコストを削減できます。
省スペース化: 独立したグラフィックスボードが不要になるため、システムを小型化できます。
効率的なメモリ利用: CPUとGPUが同じメモリを共有するため、メモリの利用効率が向上します。
デメリット
パフォーマンスの制限: メモリ帯域幅がボトルネックとなり、
CPUやGPUの性能を最大限に引き出せない場合があります。
拡張性の乏しさ: グラフィックスボードを交換・増設して性能を向上させることが難しい場合があります。また、SoCの場合は、メモリの増設も困難です。
NUMA(Non-Uniform Memory Access)
NUMAは、複数のCPUが共有するメインメモリへのアクセス方式の一種です。各CPUが異なるメモリ領域にアクセスする場合、アクセス速度に差が生じることから、このように呼ばれます。UMAという言葉は、NUMAではないことを強調する際に使われることがありますが、一般的ではありません。
従来型のPCアーキテクチャやSoC、Xbox 360などで採用されているUMAは、メモリという部品を共有しているだけで、CPUとGPUのメモリマップ(メモリ空間)までは統合されていません。そのため、CPUとGPUはそれぞれのメモリ空間にあるデータを直接共有できず、データのコピーが必要になります。これは、メモリの部品としての共有であり、NUMAに分類されます。
hUMA(heterogeneous Uniform Memory Access)
hUMAは、UMAの一種で、CPUとGPUがメモリマップまで統合されたものです。AMDがHSA(Heterogeneous System Architecture)の重要な技術として発表しました。
hUMAでは、CPUとGPUが同じメモリ空間を共有するため、GPU側もページフォールトに対応し、MMU(Memory Management Unit)で仮想メモリを管理できます。また、CPUとGPUのメモリ一貫性(メモリコヒーレンシ)がハードウェアレベルで確保されており、ソフトウェア側でデータの一貫性や同期を気にする必要がなくなります。これは、GPGPU(General-Purpose computing on Graphics Processing Units)において大きなメリットとなります。
従来型のUMAでは、CPUとGPUは異なるメモリ空間を持つため、データのやり取りにはコピーが必要でしたが、hUMAでは同じアドレス空間にあるメモリを直接読み書きできます。これにより、データ転送の手間が省け、パフォーマンスが向上します。
hUMAの利点
データ転送の効率化:
CPUとGPU間でのデータ転送が不要になるため、パフォーマンスが向上します。
*
複雑なデータ構造の扱いやすさ: GPUでポインタや参照を利用した複雑なデータ構造を直接扱えるようになります。
API側のUMA対応
従来型のUMAでは、
CPUとGPUのメモリ空間が異なるため、データ転送が必要でした。しかし、先進的なAPIの中には、UMAに対応した最適化機能を持つものがあります。
OpenCLでは、`CL_MEM_USE_HOST_PTR`または`CL_MEM_ALLOC_HOST_PTR`フラグを使用することで、
CPU側に割り当てられたメモリをバッファとして使用できます。UMA環境では、ゼロコピーバッファを実現できる可能性があり、バッファ読み書き時のコピーが不要になります。
OpenCL 2.0では、共有仮想メモリ(SVM)機能が追加され、ホストとデバイスで仮想メモリ空間を共有できるようになりました。これにより、ゼロコピーだけでなく、ポインタを使用した複雑なデータ構造もデバイス側で利用できます。
Direct3D 11.3および12では、UMA環境で冗長なコピーを減らす機能が追加されています。
Direct3D 12では、通常のUMAとキャッシュコヒーレントなUMAを区別できます。
Metal
AppleのMetal APIでは、単一の仮想メモリ領域内のアライメントされたメモリアドレスを使って、既存のメモリ領域をラップするMTLBufferオブジェクトを直接生成できます。また、`MTLStorageMode.shared`を使用することで、
CPUとGPUがシステムメモリ内のリソースへのアクセスを共有できます。ただし、
共有メモリを使う際は、
CPUまたはGPUのどちらかで変更した処理が、他方のプロセッサでアクセスする前に完了している必要があります。ソフトウェア側でのメモリ一貫性の配慮が必要になります。
Apple Silicon
Apple Siliconでは、
CPUとGPUが同じメモリ空間を共有するUMAを採用しています。Metal APIでは、
CPUとGPUで共有可能なMTLBufferとMTLTextureを生成でき、ゼロコピーによるパフォーマンスと効率の向上が可能です。
まとめ
UMAは、メインメモリを複数のデバイスで共有するアーキテクチャであり、コスト削減や省スペース化に貢献します。一方で、メモリ帯域幅がボトルネックとなる可能性や拡張性の課題も存在します。hUMAは、UMAの進化版であり、
CPUとGPUのメモリ空間を統合することで、データ転送の効率化や複雑なデータ構造の扱いやすさを実現します。また、API側のUMA対応も進んでおり、より効率的なメモリ利用が可能となっています。