Chapter 38 of 40approx 1m readHigh-Performance Computing — Notes

Memory Paging

Memory Paging

Memory Paging

Cách cache và TLB ảnh hưởng đến hiệu năng khi truy cập mảng lớn với bước nhảy (stride) khác nhau

const int N = (1 << 13);
int a[D * N];
for (int i = 0; i < D * N; i += D)
a[i] += 1;
  • Mỗi lần truy cập sẽ tải một cache line (64 byte), với N = 8192, tổng dữ liệu cần tải là 64 * N = 512 KB, vừa với L2 cache của CPU, nên ta kỳ vọng hiệu năng sẽ ổn định, không đổi khi thay đổi D.

  • Tuy nhiên khi D lớn (≥ 256), hiệu năng giảm mạnh do TLB

  • Với page_size = 4KB, CPU có:

    • L1 TLB: 64 entries → quản lý 64 × 4 KB = 512 KB.
    • L2 TLB: 2048 entries → quản lý 2048 × 4 KB = 8 MB
  • Nếu D lớn hơn 256, mảng chiếm > 8 MB vượt quá khả năng của L2 TLB, CPU phải tra cứu page table trong RAM, rất chậm

  • ==> Tăng Page Size: huge pages bằng cách chỉnh file /sys/kernel/mm/transparent_hugepage/enabled hoặc dùng system call madvise

    #include <sys/mman.h>
    void *ptr = std::aligned_alloc(page_size, array_size);
    madvise(ptr, array_size, MADV_HUGEPAGE);

Huge pages đặc biệt hữu ích cho truy cập thưa (sparse reads)

Discussion

Sign in with GitHub to comment or react. Powered by giscus.