プロセッサ・アーキテクチャ

組み込みGPU

映像処理やAIに使う並列演算器。

概要

組み込みGPU(Embedded GPU)は、組み込みシステム向けに搭載されたGraphics Processing Unit(グラフィクス処理ユニット)です。元来はディスプレイへの映像出力・3Dグラフィクス処理を目的として設計されましたが、現代では画像認識・機械学習推論・映像エンコード・デコードなど幅広い並列演算に活用されています。

組み込みGPUの最大の特徴は「大規模な並列処理能力」にあります。CPUが少数の高性能コアで逐次処理を得意とするのに対し、GPUは数百〜数千のシェーダーコア(シェーダープロセッサ)を持ち、同じ演算を多数のデータに対して同時実行するSIMD(Single Instruction, Multiple Data)型の処理が得意です。

代表的な組み込みGPUとしては:

  • Arm Mali-G系列: NXP・MediaTek・Samsung・Rockchip等のSoCに採用
  • Imagination PowerVR: Apple A系(初期)・旧Intel Atom
  • Vivante GC系列: NXP i.MX 8系列
  • NVIDIA GPU(Ampere/Volta): Jetsonシリーズ
  • Qualcomm Adreno: Snapdragon SoC搭載

歴史・背景

GPUの源流は1970〜80年代のビデオチップに遡ります。PC向けでは1999年にNVIDIAがGeForce 256で「GPU」という用語を初めて使用し、T&L(Transform and Lighting)をハードウェア化しました。

組み込み向けGPUは2000年代のスマートフォン・PDAの普及とともに急成長しました。2007年のiPhone(PowerVR MBX搭載)が組み込みGPUの重要性を示した代表例です。2010年代には3Dゲーム対応のスマートフォン(OpenGL ES対応GPU搭載)が普及しました。

GPGPU(GPU General Purpose Computing: GPUを汎用計算に使う技術)は2006年にNVIDIA CUDAが公開されてから本格化。組み込み分野ではOpenCL(2009年)がマルチベンダー標準として採用され、2010年代後半からエッジAI推論でのGPU活用が広がりました。

2017年にNVIDIAがJetson TX2を発売してから、組み込みLinux向けGPGPU市場が急拡大。自動運転・ロボット・医療AI・製造業AIなどの高性能エッジコンピューティングにJetsonシリーズが広く採用されています。

技術仕様

GPUアーキテクチャの基本

シェーダーコア(Shader Processor)

組み込みGPUはSIMD型の浮動小数点演算器(シェーダーコア)を多数並列に持ちます:

Arm Mali-G77(スマートフォン向け):
  16コアクラスター × 3 = 最大16コア
  各コアに浮動小数点演算器16本
  → 最大16 × 16 = 256並列演算

NVIDIA Jetson AGX Orin GPU:
  2048 CUDA Cores (Ampereアーキテクチャ)
  16 Tensor Cores
  最大275 TOPS (INT8)

タイルベースレンダリング(TBR)

スマートフォン向けGPU(Mali・PowerVR・Adreno)の多くはTBR(Tile-Based Rendering)を採用し、フレームバッファを小さなタイル(16×16〜32×32ピクセル)に分割してオンチップSRAM上で処理します:

フレームバッファ(例: 1920×1080)

タイル分割(32×32ピクセル = 1980タイル)

各タイルをオンチップSRAM上でレンダリング(外部メモリアクセス最小化)

完成したタイルを外部フレームバッファに書き出し

これにより外部メモリ(LPDDR)へのアクセスを削減し、電力消費を抑えます。デスクトップGPU(IMR: Immediate Mode Rendering)とは根本的に異なるアプローチです。

主要な組み込みGPU比較

GPU搭載チップ例API対応用途
Arm Mali-G52MediaTek Helio系OpenGL ES 3.2 / Vulkan / OpenCL 2.0ミドルレンジスマホ
Arm Mali-G76Kirin 980・Exynos 9820OpenGL ES 3.2 / Vulkan / OpenCL 2.0ハイエンドスマホ
Vivante GC7000LNXP i.MX 8OpenGL ES 3.1 / Vulkan / OpenCL 1.2産業組み込みLinux
Imagination AXM-8-256-OpenGL ES / Vulkan組み込み・車載
NVIDIA AmpereJetson Orin系CUDA 11 / OpenGL / VulkanハイエンドエッジAI
Qualcomm Adreno 690Snapdragon 888OpenGL ES 3.2 / Vulkan / OpenCL 2.0モバイル

グラフィクスAPI

組み込み向けの主要グラフィクスAPI:

API概要組み込み採用
OpenGL ES 3.x組み込み向けOpenGLHMI・ゲーム
Vulkan低レベル・マルチプラットフォーム高性能アプリ
OpenCL 1.2/2.0汎用GPU計算画像処理・AI
CUDANVIDIA専用Jetsonシリーズ
MetalApple専用iOS・macOS
DirectX 12Microsoft専用Windows Arm SBC

動作原理

GPGPUによる並列演算

GPUが多数のシェーダーコアで同じ計算を並列実行する仕組み:

入力データ: 1000×1000のRGB画像 (100万ピクセル)

CPU処理(逐次):
  for pixel in pixels:  # 100万回ループ
    output[pixel] = process(pixel)
  → 1コア × 100万処理

GPU処理(並列):
  各シェーダーコアが異なるピクセルグループを同時処理
  → 256コア × ~4000並列 = 100万処理を同時
  → 約256倍のスループット向上(理論値)

OpenCLカーネル例(画像処理)

// OpenCLカーネル(GPU上で実行されるコード)
__kernel void rgb_to_gray(
    __global const uchar4 *input,   // RGB入力
    __global uchar *output,          // グレースケール出力
    int width, int height)
{
    int x = get_global_id(0);  // ピクセルX座標
    int y = get_global_id(1);  // ピクセルY座標
    if (x >= width || y >= height) return;
    
    int idx = y * width + x;
    uchar4 pixel = input[idx];
    // BT.601 輝度変換
    output[idx] = (uchar)(0.299f * pixel.x + 0.587f * pixel.y + 0.114f * pixel.z);
}

ホスト側(CPU)からの起動:

// OpenCLカーネルを1000×1000グリッドで並列実行
size_t global_work_size[2] = {width, height};  // 100万スレッド起動
clEnqueueNDRangeKernel(queue, kernel, 2, NULL,
                        global_work_size, NULL, 0, NULL, NULL);

TensorRT / CUDA(Jetsonでのディープラーニング)

NVIDIA Jetson(NVIDIA Jetson)では、TensorRT経由でGPU上に推論を最適化・実行します:

# TensorRT Python APIによる推論(Jetson上)
import tensorrt as trt
import pycuda.driver as cuda

# ONNX → TensorRTエンジン変換
TRT_LOGGER = trt.Logger(trt.Logger.WARNING)
with trt.Builder(TRT_LOGGER) as builder:
    with builder.create_network(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH) as net:
        parser = trt.OnnxParser(net, TRT_LOGGER)
        parser.parse_from_file("model.onnx")
        
        config = builder.create_builder_config()
        config.max_workspace_size = 1 << 30  # 1GB
        config.set_flag(trt.BuilderFlag.FP16)  # FP16精度使用
        
        engine = builder.build_engine(net, config)

# 推論実行(Jetson GPU)
context = engine.create_execution_context()
cuda.memcpy_htod(d_input, input_data)
context.execute_v2([int(d_input), int(d_output)])
cuda.memcpy_dtoh(output_data, d_output)

用途・ユースケース

HMI(ヒューマン・マシン・インタフェース)

産業機器のタッチパネルHMI・カーナビゲーション・デジタルコックピットでは、OpenGL ESを使った滑らかなUI描画・アニメーション・3Dビジュアライゼーションに組み込みGPUが不可欠です。NXP i.MX 8(Vivante GC7000L)やRenesas RZ/G2(Arm Mali)が産業HMI向けで広く採用されています。

// OpenGL ES 3.0でのUI描画(Qt/QMLの内部で使用)
// Raspberry Pi / i.MX 8等の組み込みLinux + GPU
glClearColor(0.1f, 0.1f, 0.1f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUseProgram(shaderProgram);
glUniformMatrix4fv(modelMatrixLoc, 1, GL_FALSE, modelMatrix);
glDrawElements(GL_TRIANGLES, indexCount, GL_UNSIGNED_INT, 0);
eglSwapBuffers(display, surface);

映像エンコード・デコード

カメラ映像のH.264/H.265エンコード・デコードは組み込みGPUのハードウェアVPU(Video Processing Unit)で処理します:

  • Raspberry Pi 4: VideoCore VI GPU(H.264エンコード・デコード対応)
  • Jetson Orin: NVENC(H.264/H.265/AV1エンコード)・NVDEC(デコード)

GPUを使うことでCPU負荷を大幅に削減しながら、4K60fps相当の映像処理が可能です。

エッジAI推論

エッジAIでの物体検出・セグメンテーション・姿勢推定では、NPUがない場合にGPUが推論を担います:

  • TFLite GPU Delegate: Arm Mali GPUでの推論加速(最大10倍高速化)
  • OpenCL Inference(Arm Compute Library経由)
  • CUDA + TensorRT(NVIDIA Jetson)

コンピュータビジョン前処理

# OpenCV + GPU(CUDA)による高速画像前処理(Jetson)
import cv2

# CUDA対応のOpenCVでGPU処理
gpu_frame = cv2.cuda_GpuMat()
gpu_frame.upload(cpu_frame)

# GPU上でリサイズ・色変換
gpu_resized = cv2.cuda.resize(gpu_frame, (640, 640))
gpu_rgb = cv2.cuda.cvtColor(gpu_resized, cv2.COLOR_BGR2RGB)

# 結果をCPUに戻す(必要な場合のみ)
cpu_result = gpu_rgb.download()

実装・開発のポイント

Wayland/DRM(組み込みLinux + GPU)

デスクトップ環境なしの組み込みLinuxでのGPU活用:

# DRM/KMSでのフレームバッファ制御(X11・Waylandなし)
apt-get install libdrm-dev

# Qt with EGLFSバックエンド(Windowシステムなし)
./configure -platform linux-aarch64-gnu-g++ \
  -device-option CROSS_COMPILE=aarch64-linux-gnu- \
  -eglfs

メモリ帯域の最適化

組み込みGPUのボトルネックは多くの場合、外部メモリ(LPDDR)の帯域です:

// テクスチャ圧縮(ASTC)でメモリ帯域を削減
glCompressedTexImage2D(GL_TEXTURE_2D, 0,
    GL_COMPRESSED_RGBA_ASTC_4x4_KHR,  // 4×4ブロック圧縮(8bpp→2bpp)
    width, height, 0,
    dataSize, compressedData);

// ゼロコピー(CPU-GPU共有メモリ)
// Raspberry Piや多くのSoCはCPU・GPU共有メモリアーキテクチャ
// dma-buf / GBM(Generic Buffer Management)を使ったゼロコピー

他技術との比較

組み込みGPU vs NPU

項目組み込みGPUNPU
設計目的グラフィクス→汎用AI推論専用
推論OPS/W中(1〜10 TOPS/W)高(10〜100 TOPS/W)
量子化効率FP16主体(INT8は非最適)INT8/INT4特化
汎用性高(OpenCL・Vulkan・描画)低(推論特化)
ソフトウェアAPIOpenCL・CUDA(標準化済み)ベンダー固有(移植性低)

NPUは推論に特化した電力効率で優位ですが、グラフィクス描画・映像処理にNPUは使えません。最新のSoC(Qualcomm Snapdragon・Apple M系等)では両者が統合され、用途に応じて自動的にNPU・GPU・CPUが連携する設計になっています。

組み込みGPU vs デスクトップGPU

消費電力が桁違いに異なります。RTX 4090は450Wですが、Arm Mali-G57は数百mW以下です。処理能力もその分低いですが、組み込み用途(HMI・カメラ・ライトAI推論)には十分な性能があります。NVIDIA Jetsonは組み込みGPUの中では突出した性能(最大275 TOPS)を持ち、自動運転・ロボティクスの基板として使われています。

関連用語

参考リンク