90
Что-то с памятью моей стало Сколько стоит доступ в память, и что с этим делать Антон Орлов Qrator Labs [email protected]

Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

  • Upload
    ontico

  • View
    115

  • Download
    1

Embed Size (px)

Citation preview

Page 1: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

Что-то с памятью моей сталоСколько стоит доступ в память, и что с этим делать

Антон ОрловQrator Labs

[email protected]

Page 2: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

100 Mpps

Page 3: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

100 Mpps10 нс / пакет

Page 7: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

Время, нс

Размер данных

L1 L2 L3 RAM

The Myth of RAM

Emil Ernerfeldthttps://github.com/emilk/ram_bench

Page 8: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

Время, нс

Размер данных

L1 L2 L3 RAM

The Myth of RAM

Emil Ernerfeldthttps://github.com/emilk/ram_bench

Page 9: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

Время, нс

Размер данных

L1 L2 L3 RAM

The Myth of RAM

Emil Ernerfeldthttps://github.com/emilk/ram_bench

Page 10: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

Время, нс

Размер данных

L1 L2 L3 RAM

The Myth of RAM

Emil Ernerfeldthttps://github.com/emilk/ram_bench

Page 11: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

#define COLUMNS 10#define ROWS (1<<28) // 256MB

int main () {char* mat[COLUMNS];for (int i = 0; i < COLUMNS; i++)

mat[i] = (char*)malloc(ROWS);

for (int j = 0; j < ROWS; j++) {for (int i = 0; i < COLUMNS; i++)

mat[i][j] = (char)j;}

int res = 0;for (int i = 0; i < COLUMNS; i++)

res += mat[i][i];return res;

}

Page 12: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

#define COLUMNS 10#define ROWS (1<<28) // 256MB

int main () {char* mat[COLUMNS];for (int i = 0; i < COLUMNS; i++)

mat[i] = (char*)malloc(ROWS);

for (int j = 0; j < ROWS; j++) {for (int i = 0; i < COLUMNS; i++)

mat[i][j] = (char)j;}

int res = 0;for (int i = 0; i < COLUMNS; i++)

res += mat[i][i];return res;

}

Page 13: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

#define COLUMNS 10#define ROWS (1<<28) // 256MB

int main () {char* mat[COLUMNS];for (int i = 0; i < COLUMNS; i++)

mat[i] = (char*)malloc(ROWS);

for (int j = 0; j < ROWS; j++) {for (int i = 0; i < COLUMNS; i++)

mat[i][j] = (char)j;}

int res = 0;for (int i = 0; i < COLUMNS; i++)

res += mat[i][i];return res;

}

Page 14: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

#define COLUMNS 10#define ROWS (1<<28) // 256MB

int main () {char* mat[COLUMNS];for (int i = 0; i < COLUMNS; i++)

mat[i] = (char*)malloc(ROWS);

for (int j = 0; j < ROWS; j++) {for (int i = 0; i < COLUMNS; i++)

mat[i][j] = (char)j;}

int res = 0;for (int i = 0; i < COLUMNS; i++)

res += mat[i][i];return res;

}

Page 15: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

#define COLUMNS 10#define ROWS (1<<28) // 256MB

int main () {char* mat[COLUMNS];for (int i = 0; i < COLUMNS; i++)

mat[i] = (char*)malloc(ROWS);

for (int j = 0; j < ROWS; j++) {for (int i = 0; i < COLUMNS; i++)

mat[i][j] = (char)j;}

int res = 0;for (int i = 0; i < COLUMNS; i++)

res += mat[i][i];return res;

}

Page 16: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

#define COLUMNS 10#define ROWS (1<<28) // 256MB

int main () {char* mat[COLUMNS];for (int i = 0; i < COLUMNS; i++)

mat[i] = (char*)malloc(ROWS);

for (int j = 0; j < ROWS; j++) {for (int i = 0; i < COLUMNS; i++)

mat[i][j] = (char)j;}

int res = 0;for (int i = 0; i < COLUMNS; i++)

res += mat[i][i];return res;

}

Page 17: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

#define COLUMNS 10#define ROWS (1<<28) // 256MB

int main () {char* mat[COLUMNS];for (int i = 0; i < COLUMNS; i++)

mat[i] = (char*)malloc(ROWS);

for (int j = 0; j < ROWS; j++) {for (int i = 0; i < COLUMNS; i++)

mat[i][j] = (char)j;}

int res = 0;for (int i = 0; i < COLUMNS; i++)

res += mat[i][i];return res;

}

Page 18: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

#define COLUMNS 10#define ROWS (1<<28) // 256MB

int main () {char* mat[COLUMNS];for (int i = 0; i < COLUMNS; i++)

mat[i] = (char*)malloc(ROWS);

for (int j = 0; j < ROWS; j++) {for (int i = 0; i < COLUMNS; i++)

mat[i][j] = (char)j;}

int res = 0;for (int i = 0; i < COLUMNS; i++)

res += mat[i][i];return res;

}

Page 19: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

#define COLUMNS 10#define ROWS (1<<28) // 256MB

int main () {char* mat[COLUMNS];for (int i = 0; i < COLUMNS; i++)

mat[i] = (char*)malloc(ROWS);

for (int j = 0; j < ROWS; j++) {for (int i = 0; i < COLUMNS; i++)

mat[i][j] = (char)j;}

int res = 0;for (int i = 0; i < COLUMNS; i++)

res += mat[i][i];return res;

}

Page 20: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

#define COLUMNS 10#define ROWS (1<<28) // 256MB

int main () {char* mat[COLUMNS];for (int i = 0; i < COLUMNS; i++)

mat[i] = (char*)malloc(ROWS);

for (int j = 0; j < ROWS; j++) {for (int i = 0; i < COLUMNS; i++)

mat[i][j] = (char)j;}

int res = 0;for (int i = 0; i < COLUMNS; i++)

res += mat[i][i];return res;

}

Page 21: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

#define COLUMNS 10#define ROWS (1<<28) // 256MB

int main () {char* mat[COLUMNS];for (int i = 0; i < COLUMNS; i++)

mat[i] = (char*)malloc(ROWS);

for (int j = 0; j < ROWS; j++) {for (int i = 0; i < COLUMNS; i++)

mat[i][j] = (char)j;}

int res = 0;for (int i = 0; i < COLUMNS; i++)

res += mat[i][i];return res;

}

12.32s

Page 22: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

#define COLUMNS 10#define ROWS (1<<28) // 256MB

int main () {char* mat[COLUMNS];for (int i = 0; i < COLUMNS; i++)

mat[i] = (char*)malloc(ROWS);

for (int j = 0; j < ROWS; j++) {for (int i = 0; i < COLUMNS; i++)

mat[i][j] = (char)j;}

int res = 0;for (int i = 0; i < COLUMNS; i++)

res += mat[i][i];return res;

}

12.32s

#define COLUMNS 10#define ROWS (1<<28) // 256MB

int main () {char* mat[COLUMNS];for (int i = 0; i < COLUMNS; i++)

mat[i] = (char*)malloc(ROWS);

int res = 0;for (int i = 0; i < COLUMNS; i++)

res += mat[i][i];return res;

}

Page 23: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

#define COLUMNS 10#define ROWS (1<<28) // 256MB

int main () {char* mat[COLUMNS];for (int i = 0; i < COLUMNS; i++)

mat[i] = (char*)malloc(ROWS);

for (int j = 0; j < ROWS; j++) {for (int i = 0; i < COLUMNS; i++)

mat[i][j] = (char)j;}

int res = 0;for (int i = 0; i < COLUMNS; i++)

res += mat[i][i];return res;

}

12.32s

#define COLUMNS 10#define ROWS (1<<28) // 256MB

int main () {char* mat[COLUMNS];for (int i = 0; i < COLUMNS; i++)

mat[i] = (char*)malloc(ROWS);

for (int j = 0; j < ROWS; j++) {for (int i = 0; i < COLUMNS/2; i++)

mat[i][j] = (char)j;}

int res = 0;for (int i = 0; i < COLUMNS; i++)

res += mat[i][i];return res;

}

Page 24: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

#define COLUMNS 10#define ROWS (1<<28) // 256MB

int main () {char* mat[COLUMNS];for (int i = 0; i < COLUMNS; i++)

mat[i] = (char*)malloc(ROWS);

for (int j = 0; j < ROWS; j++) {for (int i = 0; i < COLUMNS; i++)

mat[i][j] = (char)j;}

int res = 0;for (int i = 0; i < COLUMNS; i++)

res += mat[i][i];return res;

}

12.32s

#define COLUMNS 10#define ROWS (1<<28) // 256MB

int main () {char* mat[COLUMNS];for (int i = 0; i < COLUMNS; i++)

mat[i] = (char*)malloc(ROWS);

for (int j = 0; j < ROWS; j++) {for (int i = 0; i < COLUMNS/2; i++)

mat[i][j] = (char)j;}for (int j = 0; j < ROWS; j++) {

for (int i = COLUMNS/2; i < COLUMNS; i++)mat[i][j] = (char)j;

}int res = 0;for (int i = 0; i < COLUMNS; i++)

res += mat[i][i];return res;

}

Page 25: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

#define COLUMNS 10#define ROWS (1<<28) // 256MB

int main () {char* mat[COLUMNS];for (int i = 0; i < COLUMNS; i++)

mat[i] = (char*)malloc(ROWS);

for (int j = 0; j < ROWS; j++) {for (int i = 0; i < COLUMNS/2; i++)

mat[i][j] = (char)j;}for (int j = 0; j < ROWS; j++) {

for (int i = COLUMNS/2; i < COLUMNS; i++)mat[i][j] = (char)j;

}int res = 0;for (int i = 0; i < COLUMNS; i++)

res += mat[i][i];return res;

}

Page 26: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

#define COLUMNS 10#define ROWS (1<<28) // 256MB

int main () {char* mat[COLUMNS];for (int i = 0; i < COLUMNS; i++)

mat[i] = (char*)malloc(ROWS);

for (int j = 0; j < ROWS; j++) {for (int i = 0; i < COLUMNS/2; i++)

mat[i][j] = (char)j;}for (int j = 0; j < ROWS; j++) {

for (int i = COLUMNS/2; i < COLUMNS; i++)mat[i][j] = (char)j;

}int res = 0;for (int i = 0; i < COLUMNS; i++)

res += mat[i][i];return res;

}

Page 27: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

#define COLUMNS 10#define ROWS (1<<28) // 256MB

int main () {char* mat[COLUMNS];for (int i = 0; i < COLUMNS; i++)

mat[i] = (char*)malloc(ROWS);

for (int j = 0; j < ROWS; j++) {for (int i = 0; i < COLUMNS/2; i++)

mat[i][j] = (char)j;}for (int j = 0; j < ROWS; j++) {

for (int i = COLUMNS/2; i < COLUMNS; i++)mat[i][j] = (char)j;

}int res = 0;for (int i = 0; i < COLUMNS; i++)

res += mat[i][i];return res;

}

Page 28: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

#define COLUMNS 10#define ROWS (1<<28) // 256MB

int main () {char* mat[COLUMNS];for (int i = 0; i < COLUMNS; i++)

mat[i] = (char*)malloc(ROWS);

for (int j = 0; j < ROWS; j++) {for (int i = 0; i < COLUMNS/2; i++)

mat[i][j] = (char)j;}for (int j = 0; j < ROWS; j++) {

for (int i = COLUMNS/2; i < COLUMNS; i++)mat[i][j] = (char)j;

}int res = 0;for (int i = 0; i < COLUMNS; i++)

res += mat[i][i];return res;

}

Page 29: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

#define COLUMNS 10#define ROWS (1<<28) // 256MB

int main () {char* mat[COLUMNS];for (int i = 0; i < COLUMNS; i++)

mat[i] = (char*)malloc(ROWS);

for (int j = 0; j < ROWS; j++) {for (int i = 0; i < COLUMNS/2; i++)

mat[i][j] = (char)j;}for (int j = 0; j < ROWS; j++) {

for (int i = COLUMNS/2; i < COLUMNS; i++)mat[i][j] = (char)j;

}int res = 0;for (int i = 0; i < COLUMNS; i++)

res += mat[i][i];return res;

}

Page 30: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

#define COLUMNS 10#define ROWS (1<<28) // 256MB

int main () {char* mat[COLUMNS];for (int i = 0; i < COLUMNS; i++)

mat[i] = (char*)malloc(ROWS);

for (int j = 0; j < ROWS; j++) {for (int i = 0; i < COLUMNS/2; i++)

mat[i][j] = (char)j;}for (int j = 0; j < ROWS; j++) {

for (int i = COLUMNS/2; i < COLUMNS; i++)mat[i][j] = (char)j;

}int res = 0;for (int i = 0; i < COLUMNS; i++)

res += mat[i][i];return res;

}

Page 31: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

#define COLUMNS 10#define ROWS (1<<28) // 256MB

int main () {char* mat[COLUMNS];for (int i = 0; i < COLUMNS; i++)

mat[i] = (char*)malloc(ROWS);

for (int j = 0; j < ROWS; j++) {for (int i = 0; i < COLUMNS/2; i++)

mat[i][j] = (char)j;}for (int j = 0; j < ROWS; j++) {

for (int i = COLUMNS/2; i < COLUMNS; i++)mat[i][j] = (char)j;

}int res = 0;for (int i = 0; i < COLUMNS; i++)

res += mat[i][i];return res;

}

Page 32: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

#define COLUMNS 10#define ROWS (1<<28) // 256MB

int main () {char* mat[COLUMNS];for (int i = 0; i < COLUMNS; i++)

mat[i] = (char*)malloc(ROWS);

for (int j = 0; j < ROWS; j++) {for (int i = 0; i < COLUMNS/2; i++)

mat[i][j] = (char)j;}for (int j = 0; j < ROWS; j++) {

for (int i = COLUMNS/2; i < COLUMNS; i++)mat[i][j] = (char)j;

}int res = 0;for (int i = 0; i < COLUMNS; i++)

res += mat[i][i];return res;

}

Page 33: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

#define COLUMNS 10#define ROWS (1<<28) // 256MB

int main () {char* mat[COLUMNS];for (int i = 0; i < COLUMNS; i++)

mat[i] = (char*)malloc(ROWS);

for (int j = 0; j < ROWS; j++) {for (int i = 0; i < COLUMNS/2; i++)

mat[i][j] = (char)j;}for (int j = 0; j < ROWS; j++) {

for (int i = COLUMNS/2; i < COLUMNS; i++)mat[i][j] = (char)j;

}int res = 0;for (int i = 0; i < COLUMNS; i++)

res += mat[i][i];return res;

}

Page 34: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

#define COLUMNS 10#define ROWS (1<<28) // 256MB

int main () {char* mat[COLUMNS];for (int i = 0; i < COLUMNS; i++)

mat[i] = (char*)malloc(ROWS);

for (int j = 0; j < ROWS; j++) {for (int i = 0; i < COLUMNS/2; i++)

mat[i][j] = (char)j;}for (int j = 0; j < ROWS; j++) {

for (int i = COLUMNS/2; i < COLUMNS; i++)mat[i][j] = (char)j;

}int res = 0;for (int i = 0; i < COLUMNS; i++)

res += mat[i][i];return res;

}

Page 35: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

#define COLUMNS 10#define ROWS (1<<28) // 256MB

int main () {char* mat[COLUMNS];for (int i = 0; i < COLUMNS; i++)

mat[i] = (char*)malloc(ROWS);

for (int j = 0; j < ROWS; j++) {for (int i = 0; i < COLUMNS/2; i++)

mat[i][j] = (char)j;}for (int j = 0; j < ROWS; j++) {

for (int i = COLUMNS/2; i < COLUMNS; i++)mat[i][j] = (char)j;

}int res = 0;for (int i = 0; i < COLUMNS; i++)

res += mat[i][i];return res;

}

Page 36: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

#define COLUMNS 10#define ROWS (1<<28) // 256MB

int main () {char* mat[COLUMNS];for (int i = 0; i < COLUMNS; i++)

mat[i] = (char*)malloc(ROWS);

for (int j = 0; j < ROWS; j++) {for (int i = 0; i < COLUMNS/2; i++)

mat[i][j] = (char)j;}for (int j = 0; j < ROWS; j++) {

for (int i = COLUMNS/2; i < COLUMNS; i++)mat[i][j] = (char)j;

}int res = 0;for (int i = 0; i < COLUMNS; i++)

res += mat[i][i];return res;

}

Page 37: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

#define COLUMNS 10#define ROWS (1<<28) // 256MB

int main () {char* mat[COLUMNS];for (int i = 0; i < COLUMNS; i++)

mat[i] = (char*)malloc(ROWS);

for (int j = 0; j < ROWS; j++) {for (int i = 0; i < COLUMNS/2; i++)

mat[i][j] = (char)j;}for (int j = 0; j < ROWS; j++) {

for (int i = COLUMNS/2; i < COLUMNS; i++)mat[i][j] = (char)j;

}int res = 0;for (int i = 0; i < COLUMNS; i++)

res += mat[i][i];return res;

}

Page 38: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

#define COLUMNS 10#define ROWS (1<<28) // 256MB

int main () {char* mat[COLUMNS];for (int i = 0; i < COLUMNS; i++)

mat[i] = (char*)malloc(ROWS);

for (int j = 0; j < ROWS; j++) {for (int i = 0; i < COLUMNS; i++)

mat[i][j] = (char)j;}

int res = 0;for (int i = 0; i < COLUMNS; i++)

res += mat[i][i];return res;

}

12.32s

#define COLUMNS 10#define ROWS (1<<28) // 256MB

int main () {char* mat[COLUMNS];for (int i = 0; i < COLUMNS; i++)

mat[i] = (char*)malloc(ROWS);

for (int j = 0; j < ROWS; j++) {for (int i = 0; i < COLUMNS/2; i++)

mat[i][j] = (char)j;}for (int j = 0; j < ROWS; j++) {

for (int i = COLUMNS/2; i < COLUMNS; i++)mat[i][j] = (char)j;

}int res = 0;for (int i = 0; i < COLUMNS; i++)

res += mat[i][i];return res;

}

1.96s

Page 39: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

Время, сек

Количество колонок

Page 40: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

Как понять, что происходит?# likwid-perfctr -E L1Found 13 event(s) with search key L1:

PAGE_WALKER_LOADS_ITLB_L1

MEM_LOAD_UOPS_RETIRED_L1_HIT

MEM_LOAD_UOPS_RETIRED_L1_MISS

MEM_LOAD_UOPS_RETIRED_L1_ALL

L2_TRANS_L1D_WB

L1_POWER_CYCLES

L1D_PEND_MISS_PENDING

L1D_PEND_MISS_PENDING_CYCLES

L1D_PEND_MISS_OCCURRENCES

L1D_REPLACEMENT

CYCLE_ACTIVITY_CYCLES_L1D_MISS

CYCLE_ACTIVITY_STALLS_L1D_MISS

PAGE_WALKER_LOADS_DTLB_L1

https://github.com/RRZE-HPC/likwid

Page 41: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

Как понять, что происходит?Events:

• L1D_REPLACEMENT 911,569,595 51,124,840

• L2_TRANS_L1D_WB 957,062,801 54,446,831

Metric:

• L2 data volume [GBytes] 119.5931 6.7568

Page 42: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

Адресация в 8-канальном 32КБ кэше

063

Page 43: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

Адресация в 8-канальном 32КБ кэше

04863

Page 44: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

• Кэш-линия: 64 = 26 байт

Адресация в 8-канальном 32КБ кэше

064863

Page 45: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

• Кэш-линия: 64 = 26 байт• Всего кэш-линий: 32 КБ / 64 Б = 512

Адресация в 8-канальном 32КБ кэше

064863

Page 46: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

• Кэш-линия: 64 = 26 байт• Всего кэш-линий: 32 КБ / 64 Б = 512

Адресация в 8-канальном 32КБ кэше

064863

8

Page 47: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

Адресация в 8-канальном 32КБ кэше

064863

64

8

• Кэш-линия: 64 = 26 байт• Всего кэш-линий: 32 КБ / 64 Б = 512• Бакетов: 512 / 8 = 64 = 26

Page 48: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

Адресация в 8-канальном 32КБ кэше

06124863

64

8

• Кэш-линия: 64 = 26 байт• Всего кэш-линий: 32 КБ / 64 Б = 512• Бакетов: 512 / 8 = 64 = 26

idx

Page 49: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

Адресация в 8-канальном 32КБ кэше

06124863

64

8

• Кэш-линия: 64 = 26 байт• Всего кэш-линий: 32 КБ / 64 Б = 512• Бакетов: 512 / 8 = 64 = 26

tag idx

Page 50: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

Адресация в 8-канальном 32КБ кэше

06124863

64

8

• Кэш-линия: 64 = 26 байт• Всего кэш-линий: 32 КБ / 64 Б = 512• Бакетов: 512 / 8 = 64 = 26

• В каждом бакете:у адресов совпадают 6 бит idx

tag idx

Page 51: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

#define COLUMNS 10#define ROWS (1<<28) // 256MB

int main () {char* mat[COLUMNS];for (int i = 0; i < COLUMNS; i++)

mat[i] = (char*)malloc(ROWS);

for (int j = 0; j < ROWS; j++) {for (int i = 0; i < COLUMNS; i++)

mat[i][j] = (char)j;}

int res = 0;for (int i = 0; i < COLUMNS; i++)

res += mat[i][i];return res;

}

12.32s

Page 52: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

#define COLUMNS 10#define ROWS (1<<28) // 256MB

int main () {char* mat[COLUMNS];for (int i = 0; i < COLUMNS; i++)

mat[i] = (char*)malloc(ROWS + 64*i) + 64*i;

for (int j = 0; j < ROWS; j++) {for (int i = 0; i < COLUMNS; i++)

mat[i][j] = (char)j;}

int res = 0;for (int i = 0; i < COLUMNS; i++)

res += mat[i][i];return res;

}

Page 53: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

#define COLUMNS 10#define ROWS (1<<28) // 256MB

int main () {char* mat[COLUMNS];for (int i = 0; i < COLUMNS; i++)

mat[i] = (char*)malloc(ROWS + 64*i) + 64*i;

for (int j = 0; j < ROWS; j++) {for (int i = 0; i < COLUMNS; i++)

mat[i][j] = (char)j;}

int res = 0;for (int i = 0; i < COLUMNS; i++)

res += mat[i][i];return res;

}

Page 54: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

#define COLUMNS 10#define ROWS (1<<28) // 256MB

int main () {char* mat[COLUMNS];for (int i = 0; i < COLUMNS; i++)

mat[i] = (char*)malloc(ROWS + 64*i) + 64*i;

for (int j = 0; j < ROWS; j++) {for (int i = 0; i < COLUMNS; i++)

mat[i][j] = (char)j;}

int res = 0;for (int i = 0; i < COLUMNS; i++)

res += mat[i][i];return res;

}

Page 55: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

#define COLUMNS 10#define ROWS (1<<28) // 256MB

int main () {char* mat[COLUMNS];for (int i = 0; i < COLUMNS; i++)

mat[i] = (char*)malloc(ROWS + 64*i) + 64*i;

for (int j = 0; j < ROWS; j++) {for (int i = 0; i < COLUMNS; i++)

mat[i][j] = (char)j;}

int res = 0;for (int i = 0; i < COLUMNS; i++)

res += mat[i][i];return res;

}

Page 56: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

#define COLUMNS 10#define ROWS (1<<28) // 256MB

int main () {char* mat[COLUMNS];for (int i = 0; i < COLUMNS; i++)

mat[i] = (char*)malloc(ROWS + 64*i) + 64*i;

for (int j = 0; j < ROWS; j++) {for (int i = 0; i < COLUMNS; i++)

mat[i][j] = (char)j;}

int res = 0;for (int i = 0; i < COLUMNS; i++)

res += mat[i][i];return res;

}

2.12s

Page 57: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

Кэш L1 и виртуальная память

06124863

64

8

Виртуальный адрес:

tag idx

Page 58: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

Кэш L1 и виртуальная память

06124863

64

8

Виртуальный адрес:

tag idx

Страница: 4096 байт (12 бит адреса)

Page 59: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

Кэш L1 и виртуальная память

06124863

64

8

Виртуальный адрес:

tag idx

061245

Физический адрес:

tag idx

Страница: 4096 байт (12 бит адреса)

Page 60: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

Кэш L1 и виртуальная память

06124863

64

8

Виртуальный адрес:

tag idx

061245

Физический адрес:

tag idx

Страница: 4096 байт (12 бит адреса)

TLB: кэш для трансляции адресов

Page 61: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

Проблема мелких страниц

64

8

1. Страница: 4 КБ

Page 62: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

64

8Проблема мелких страниц1. Страница: 4 КБ2. L1 = 8 × 4 КБ = 32 КБ

Page 63: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

64

8Проблема мелких страниц1. Страница: 4 КБ2. L1 = 8 × 4 КБ = 32 КБ

Что делать?• Повышать ассоциативность (канальность)• Виртуальные адреса в кэше

Page 64: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

64

8Проблема мелких страниц1. Страница: 4 КБ2. L1 = 8 × 4 КБ = 32 КБ

Что делать?• Повышать ассоциативность (канальность)• Виртуальные адреса в кэше

3. TLB маленький!64 × 4 КБ = 512 КБ

Page 65: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

1. Страница: 4 КБ2. L1 = 8 × 4 КБ = 32 КБ

Что делать?• Повышать ассоциативность (канальность)• Виртуальные адреса в кэше

3. TLB маленький!64 × 4 КБ = 512 КБ

4. Количество страниц256 ГБ / 4 КБ = 64 М!

Проблема мелких страниц

64

8

Page 66: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

Source: http://mechanical-sympathy.blogspot.ru/2013/02/cpu-cache-flushing-fallacy.html

Page 67: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

Source: http://mechanical-sympathy.blogspot.ru/2013/02/cpu-cache-flushing-fallacy.html

Page 68: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

Source: http://mechanical-sympathy.blogspot.ru/2013/02/cpu-cache-flushing-fallacy.html

Page 69: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

Source: http://mechanical-sympathy.blogspot.ru/2013/02/cpu-cache-flushing-fallacy.html

Page 70: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

Source: http://mechanical-sympathy.blogspot.ru/2013/02/cpu-cache-flushing-fallacy.html

Page 71: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

Source: http://mechanical-sympathy.blogspot.ru/2013/02/cpu-cache-flushing-fallacy.html

Page 72: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

Source: http://mechanical-sympathy.blogspot.ru/2013/02/cpu-cache-flushing-fallacy.html

Page 73: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

Row hammer

Source: https://en.wikipedia.org/wiki/Row_hammerSource: https://www.akkadia.org/drepper/cpumemory.pdf

Page 74: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

Row hammer

Source: https://en.wikipedia.org/wiki/Row_hammerSource: https://www.akkadia.org/drepper/cpumemory.pdf

Page 75: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

Row hammer

Source: https://en.wikipedia.org/wiki/Row_hammerSource: https://www.akkadia.org/drepper/cpumemory.pdf

Page 76: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

Summary

• Меньше памяти — лучше!• Доступ в память — не O(1)• Меньше промахов в кэши и TLB• Меньше задержки на линках (RDIMM, LRDIMM, ECC)

Page 77: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

Summary

• Меньше памяти — лучше!• Доступ в память — не O(1)• Меньше промахов в кэши и TLB• Меньше задержки на линках (RDIMM, LRDIMM, ECC)

• Важно помнить про иерархию• Cчетчики• Через уровни можно прыгать

Page 78: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

Future

1. Parallel → Serial• HMC

2. 3D stacking• 3D TSV RLDIMM• HBM

3. NVRAM

Page 79: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

Source: http://www.intelsalestraining.com/infographics/memory/3DXPointc.pdf

Page 80: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

NVRAM в качестве основной памяти?

1: node = nvm_alloc(sizeof(node_t));2: node->value = val;3: node->next = head;4: head = node;

Source: http://www.hpl.hp.com/techreports/2012/HPL-2012-236.pdf

Page 81: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

NVRAM в качестве основной памяти?

1: node = nvm_alloc(sizeof(node_t));2: node->value = val;3: node->next = head;4: head = node;

Intel:● CLWB (Cache Line Write Back)● PCOMMIT (to Persistent storage COMMIT)

Source: http://www.hpl.hp.com/techreports/2012/HPL-2012-236.pdf

Page 82: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

NVRAM в качестве основной памяти?

1: node = nvm_alloc(sizeof(node_t));2: node->value = val;3: node->next = head;4: head = node;

Intel:● CLWB (Cache Line Write Back)● PCOMMIT (to Persistent storage COMMIT)

Source: http://www.hpl.hp.com/techreports/2012/HPL-2012-236.pdf

Page 83: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

Спасибо за внимание!Вопросы?“What Every Programmer Should Know About Memory”

Ulrich Drepper, 2007

https://www.akkadia.org/drepper/cpumemory.pdf

Page 84: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

Другие полезные ссылки• Dick Sites, Datacenter Computers: modern challenges in CPU designВидео: https://www.youtube.com/watch?v=QBu2Ae8-8LMСлайды: http://www.pdl.cmu.edu/SDI/2015/slides/DatacenterComputers.pdf

• What's new in CPUs since the 80s and how does it affect programmers?http://danluu.com/new-cpu-features/

• Row hammer Android exploit https://www.vusec.net/projects/drammer/

• Kumud Bhandari, Dhruva R. Chakrabarti, Hans-J. Boehm, Implications of CPU Caching on Byte-addressable Non-Volatile Memory Programminghttp://www.hpl.hp.com/techreports/2012/HPL-2012-236.pdf

Page 85: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

RDIMM LRDIMM

Source: https://habrahabr.ru/company/hostkey/blog/272063/

Page 86: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

2.5 ГБ

Page 87: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

2.5 ГБ

Page 88: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

2.5 ГБ

L1 TLB

Page 89: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

2.5 ГБ

L2 TLB

Page 90: Что-то с памятью моей стало… Сколько стоит доступ в память, и что с этим делать / Антон Орлов (Qrator Labs)

256 ГБ

L2 TLB