Что будет занесено в Cache при доступе к переменной структуры с указателем? - PullRequest
0 голосов
/ 23 апреля 2019

У меня есть структура в Си, определенная так, чтобы это был размер строки кэша (64 байта).

typedef struct _list{
  int value_1;
  int value_2;
  char padding[40];
  struct _list * next;
  struct _list * prev;
} list;

Тогда, если я создам элементы этого типа

volatile list * el1 = malloc(sizeof(list));
el1->value_1 = 1;

volatile list * el2 = malloc(sizeof(list));
el2->value_1 = 1;

volatile list * el3 = malloc(sizeof(list));
el3->value_1 = 1;

el1->next = el2;
el2->next = el3;

volatile list * temp = el1;

//flushed above elements from cache.

temp = temp->next;

элементы создаются с промежутком в 16 байтов между ними:

 el1:  value_1: 0x557816467530, next: 0x557816467560
 el2:  value_1: 0x557816467580, next: 0x5578164675b0,

С таким кодом, после очистки, с отключенными предварительными выборщиками, выполнение последней строки:

1) В кеше он только принесет элемент el1 и изменит темп, чтобы он смотрел на адрес, по которому смотрит следующий элемент el1. Этот код не приведет к тому, что элемент el2 будет занесен в кеш, верно?

2) принесет ли он в кеш адрес из следующей переменной? начиная с 0x557816467560 и плюс следующие соседние 64 байта? (Если так В следующих смежных байтах будет ли разрыв 16 байтов?)

1 Ответ

2 голосов
/ 27 апреля 2019

1) Правильно. Когда он читает el1->next, он читает строку кэша, содержащую этот элемент, но не читает строку кэша, на которую он указывает. (Процессор не знает, что значение этого поля является адресом памяти, пока не выполнит команду, которая его разыменует.)

2) Строка кэша имеет 64 байта, которые выровнены по 64 байта. Если вы обращаетесь к next и он находится по адресу, скажем, 0x600428, то строка кэша, которая будет прочитана, содержит байты 0x600400 - 0x60043f. Процессор не знает, каков размер структуры, и он не знает, что некоторые части структуры заполнены. Если вы обращаетесь к одному элементу структуры, которая охватывает две строки кэша, процессор не может знать об этом, поэтому он просто читает строку кэша, к которой осуществляется доступ. (Аппаратный предварительный выборщик может извлечь следующую строку, ожидая, что это может скоро понадобиться, но это не связано с размером структуры.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...