@newuser8888

Как сломать кэш первого уровня на примере кода и правильно ли я мыслю на тему выравнивания, кэша и слова цпу?

Кэш первого уровня 32килобайта(ну, у меня), линия кэша 64 байта, линий кэша первого уровня 512.
Struct в момент создания выравнивается, а потом выравнивает данные, т.к. все данные размером 8 байтов(даблы) - выравнивание не требуется.
Слово цпу - это поинтер? Поинтер у х64 - 8 байтов.
Выравнивание происходит для быстрого доступа к памяти посредством перемножения поинтера 8байтов * на число.
Вот, я создал структуру размером в 64 байта. 8 байтов * 8 - размер линии кэша.
Цпу направляет поинтер в память, кусок памяти берется в линию кэша второго уровня, потом из кэша второго уровня в первый? Или из первого кэша, если линий кэша мало и она удаляется - она переносится в кэш второго уровня?
Как мне сломать кэш на примере этого кода? Чтобы создать много кэш промахов L1.
При первом запросе поинтера - структура размером 64 байта помещается в линию кэша 64 байта, после этого все последующие запросы идут в кэш, а не в память?
И как создать идеальный код на примере этого? Правильно я мыслю?
Пытаюсь разобраться во всем этом, хелп.

5f6b78e97b5c1498737926.png
#include <iostream>
#include <vector>
using namespace std;

struct Car {
  double one = 8;
  double two = 8;
  double three = 8;
  double four = 8;
  double five = 8;
  double six = 8;
  double seven = 8;
  double eight = 8;
};

int main() {
  vector<Car*> cars;
  for (int i = 0; i < 512; ++i)
    cars.push_back(new Car());

  for (int i = 0; i < 512; ++i) {
    cout << cars[i]->one;
    cout << cars[i]->two;
    cout << cars[i]->three;
    cout << cars[i]->four;
    cout << cars[i]->five;
    cout << cars[i]->six;
    cout << cars[i]->seven;
    cout << cars[i]->eight;
  }
}
  • Вопрос задан
  • 237 просмотров
Пригласить эксперта
Ответы на вопрос 2
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Нестареющая классика с ответами на многие твои вопросы: https://akkadia.org/drepper/cpumemory.pdf

Или из первого кэша, если линий кэша мало и она удаляется - она переносится в кэш второго уровня?

Зависит от того, какой кэш -- exclusive или inclusive.
Ответ написан
Комментировать
Во-первых, вывод в cout перевешивает любые промахи кеша, так что его надо заменить, например, на подсчёт суммы.

Во-вторых, зачем тут именно вектор указателей? Тем более, сырых указателей и new/delete?! (Кстати, delete-то и нету...) Заменить просто на вектор из Car.

В-третьих, лучше всего промахи кеша продемонстрирует не последовательный, а рандомный доступ к памяти. То есть в цикле на протяжении миллиона (или сколько там нужно) итераций тягай элемент из рандомного места в массиве и добавляй в сумму. Кстати, подумай над тем, чтобы использовать рандом пошустрее, а то он убьёт всю затею так же, как cout.

Ну и да, основная идея в том, чтобы менять размер массива и мерять скорость.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы