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