CPU (Host)
─────────────────────────────────────────────────────
1. Allocate Memory (Host)
┌─────────────────────────────────────────────────┐
│ h_a[LENGTH] │
│ h_b[LENGTH] │
│ h_c[LENGTH] │
└─────────────────────────────────────────────────┘
↓
2. Allocate Memory (Device)
┌─────────────────────────────────────────────────┐
│ d_a[LENGTH] (on GPU) │
│ d_b[LENGTH] (on GPU) │
│ d_c[LENGTH] (on GPU) │
└─────────────────────────────────────────────────┘
↓
3. Copy Data (Host → Device)
┌─────────────────────────────────────────────────┐
│ memcpy(h_a → d_a) │
│ memcpy(h_b → d_b) │
└─────────────────────────────────────────────────┘
↓
4. Kernel Launch
┌────────────────────────────────────────────────────────────────────┐
│ CUDA Grid Configuration │
│ ┌──────────────────┬──────────────────┬──────────────────┬───┐ │
│ │ Block 0 │ Block 1 │ Block 2 │...│ │
│ │ ┌───┬───┬───┬─ │ ┌───┬───┬───┬─ │ ┌───┬───┬───┬─ │ │ │
│ │ │ T │ T │ T │ │ │ T │ T │ T │ │ │ T │ T │ T │ │ │ │
│ │ │ h │ h │ h │ │ │ h │ h │ h │ │ │ h │ h │ h │ │ │ │
│ │ │ r │ r │ r │ │ │ r │ r │ r │ │ │ r │ r │ r │ │ │ │
│ │ │ e │ e │ e │ │ │ e │ e │ e │ │ │ e │ e │ e │ │ │ │
│ │ │ a │ a │ a │ │ │ a │ a │ a │ │ │ a │ a │ a │ │ │ │
│ │ │ d │ d │ d │ │ │ d │ d │ d │ │ │ d │ d │ d │ │ │ │
│ │ └───┴───┴───┴─ │ └───┴───┴───┴─ │ └───┴───┴───┴─ │ │ │
│ └──────────────────┴──────────────────┴──────────────────┴───┘ │
│ Each thread computes: c[i] = a[i] + b[i] │
└────────────────────────────────────────────────────────────────────┘
↓
5. Copy Data (Device → Host)
┌─────────────────────────────────────────────────┐
│ memcpy(d_c → h_c) │
└─────────────────────────────────────────────────┘
↓
6. Result Verification
┌─────────────────────────────────────────────────┐
│ Check if h_c[i] == h_a[i] + h_b[i] │
└─────────────────────────────────────────────────┘
↓
7. Free Memory
┌─────────────────────────────────────────────────┐
│ Free d_a, d_b, d_c on GPU │
│ Free h_a, h_b, h_c on CPU │
└─────────────────────────────────────────────────┘