apple-silicon について
Apple Silicon 向けの開発を案内するエージェントスキルです。ネイティブ ARM64 の macOS アプリを開発するエンジニア向けに、ユニファイドメモリ、Metal、16 KB ページ、Rosetta 2 を扱います。
主な機能
- 01ユニファイドメモリアーキテクチャの理解
- 02Accelerate による行列演算
- 03Metal Performance Shaders による GPU 計算
- 04ハードウェア情報の取得と性能分析
- 0516 KB ページと Rosetta 2 への対応
活用シーン
- 01M1 から M4 の ARM64 アプリの最適化
- 02CPU とメモリの性能問題の調査
- 03GPU 計算での Metal の選択
- 04x86 バイナリの Rosetta 互換性の確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ mohitmishra786/ low-level-dev-skills --skill apple-siliconインストール後、Claude Code で/apple-siliconを入力して読み込まれたか確認します。
詳細
Apple Silicon
目的
Apple Silicon(M シリーズ)開発に関するエージェント向けガイドです。ユニファイドメモリアーキテクチャ、Accelerate を介した AMX 行列コプロセッサへのアクセス、GPU 計算向け Metal Performance Shaders、sysctl によるハードウェア情報の取得、Instruments によるプロファイリング、コマンドラインのリーク検出ツール、Rosetta 2 の変換動作、16KB ページサイズの影響を扱います。
使用する場面
- macOS 上で M1/M2/M3/M4 向けのネイティブ ARM64 アプリを最適化する場合
- 個別 GPU との PCIe 転送なしで GPU/NPU 計算を利用する場合
- Instruments またはコマンドラインツールでメモリと CPU をプロファイリングする場合
- x86 バイナリの Rosetta 2 互換性を把握する場合
- Apple Silicon の 16KB ページサイズに合わせてコードを調整する場合
- Accelerate/vDSP/BLAS を介して行列アクセラレーションを利用する場合
ワークフロー
1. ユニファイドメモリアーキテクチャ
Apple Silicon SoC
├── CPU cores (P + E cores)
├── GPU cores
├── Neural Engine (NPU)
└── Unified DRAM — single address space, no PCIe copy
影響:
- Metal では CPU↔GPU 間の
cudaMemcpyに相当する処理は不要です - メモリ帯域幅はエージェント間で共有されるため、全体を考慮してプロファイリングしてください
- プロセスメモリには、ユニファイドメモリによるすべての割り当てが含まれます
2. ハードウェア情報
# CPU and chip info
sysctl -n machdep.cpu.brand_string
sysctl hw.physicalcpu hw.logicalcpu
sysctl hw.memsize
# ARM64 features (keys vary by chip — grep if specific FEAT_* is missing)
sysctl -a hw.optional.arm 2>/dev/null | grep -iE 'sve|bf16|mte'
# Cache line size
sysctl hw.cachelinesize
# Page size (16KB on macOS Apple Silicon)
sysctl hw.pagesize # 16384
getconf PAGESIZE
3. 16KB ページサイズに関する考慮事項
Apple Silicon 上の macOS では、4KB ではなく16KB ページが使われます。
// Align hot buffers to page size
size_t page = sysconf(_SC_PAGESIZE); // 16384
void *buf = aligned_alloc(page, size);
// mmap alignment must be page-aligned
mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
影響:
- 大きな割り当てでは、
posix_memalignの最小アラインメントが 16KB になることがよくあります - JVM/Go ランタイムは自動調整されますが、カスタムアロケーターは対応が必要です
- 実機でテストしてください。x86 の CI では 4KB ページが使われる場合があります
4. AMX(Apple Matrix Coprocessor)
AMX は ISA レベルでは公開されていません。フレームワークを介してアクセスしてください。
// Accelerate framework — uses AMX internally for matrix ops
#include <Accelerate/Accelerate.h>
void matrix_multiply(const float *A, const float *B, float *C,
int M, int N, int K) {
cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,
M, N, K, 1.0f, A, K, B, N, 0.0f, C, N);
}
# Link Accelerate (default on macOS)
clang -framework Accelerate -o gemm gemm.c -lcblas
カスタム AMX カーネルを作成する場合は、コミュニティによるリバースエンジニアリングを調査するか、サポートされている方法として Metal Performance Shaders を使用してください。
5. Metal Performance Shaders(MPS)
// Objective-C / Swift — GPU compute via MPS
#import <Metal/Metal.h>
#import <MetalPerformanceShaders/MetalPerformanceShaders.h>
id<MTLDevice> device = MTLCreateSystemDefaultDevice();
id<MTLCommandQueue> queue = [device newCommandQueue];
MPSMatrixMultiplication *gemm = [[MPSMatrixMultiplication alloc]
initWithDevice:device transposeLeft:NO transposeRight:NO
resultRows:M columns:N interiorColumns:K alpha:1.0 beta:0.0];
Metal は GPU へのユニファイドメモリ経路を提供します。MTLResourceStorageModeShared で割り当てたバッファーでは、明示的なコピーは不要です。
6. Instruments によるプロファイリング
# Command-line Instruments (xctrace)
xctrace record --template 'Time Profiler' --launch -- /path/to/app
xctrace record --template 'Allocations' --launch -- /path/to/app
xctrace record --template 'Leaks' --launch -- /path/to/app
xctrace export --input trace.trace --toc
| テンプレート | 用途 |
|---|---|
| Time Profiler | CPU のホットスポット、P コア/E コアの使用状況 |
| Allocations | ヒープの増加、割り当てのコールツリー |
| Leaks | 解放されずに保持されているメモリ |
| System Trace | スレッドのスケジューリング、システムコール |
GUI:Xcode → Product → Profile(⌘I)
7. コマンドラインのデバッグツール
# Process memory map
vmmap <pid>
# Heap analysis
heap <pid>
heap <pid> -addresses all # all allocations
# Leak detection
leaks <pid>
leaks --list <pid>
# Sample call stacks
sample <pid> 5 -file sample.txt
8. Rosetta 2 による変換
# Check if process runs under Rosetta
sysctl sysctl.proc_translated # 1 = translated x86
# Force arch
arch -arm64 ./native_binary
arch -x86_64 ./x86_binary
# Universal binary info
lipo -info myapp
file myapp
| ネイティブ ARM64 で実行 | Rosetta で実行 |
|---|---|
| ARM64 ビルド | x86_64 専用バイナリ |
-arch arm64 でコンパイル | ダウンロードした Intel 専用アプリ |
Rosetta 2 は JIT キャッシュを使って x86_64 を ARM64 に変換します。AVX/AVX2 も変換されますが、速度が低下する場合があります。カーネル拡張や VM ゲストには対応していません。
9. メモリタグ付け(ARM MTE)
将来の Apple ハードウェアでは MTE が利用可能になる可能性があります。次の方法で確認してください。
sysctl hw.optional.arm.FEAT_MTE # when available
Apple の ARM64e プラットフォームでは、すでにポインター認証が有効になっています。これを踏まえて準備してください。
10. ビルドとパフォーマンスに関するヒント
# Native optimized build
clang -arch arm64 -O3 -mcpu=apple-m1 -o app app.c
# Use -mcpu matching target: apple-m1, apple-m2, apple-m3, apple-m4
# P/E core awareness — dispatch heavy work to performance cores
# pthread_set_qos_class_self_np(QOS_CLASS_USER_INITIATED, 0);
よくある問題
| 症状 | 原因 | 対処法 |
|---|---|---|
| mmap が EINVAL で失敗する | 16KB システムでの 4KB アラインメント | sysconf(_SC_PAGESIZE) に合わせてアラインメントを調整する |
| x86 バイナリの動作が遅い | Rosetta によるオーバーヘッド | ユニバーサルビルドまたは arm64 専用ビルドを提供する |
| Metal バッファーが nil になる | シミュレーターと実機の違い | 実機で GPU をテストする |
| Accelerate の結果が正しくない | 行優先と列優先の不一致 | BLAS の先頭次元を確認する |
| Instruments のトレースが空になる | サンドボックス/権限 | Xcode から実行するか、アプリに署名する |
| sysctl が見つからない | キー名が誤っている | `sysctl -a |
関連スキル
skills/low-level-programming/assembly-arm— Darwin ABI、AArch64skills/platform/arm-sve— M4+ の SVE2skills/gpu/cuda— Apple Silicon では NVIDIA を使用できません。代わりに Metal を使用してくださいskills/profilers/heaptrack— クロスプラットフォームのヒーププロファイリングの概念skills/compilers/clang— Apple Clang のフラグskills/low-level-programming/cpu-cache-opt— ユニファイドメモリでのキャッシュ最適化