Я провожу простой тест по мониторингу ошибок страницы с помощью приведенного ниже кода. Я не знаю, как простая одна строка кода ниже удвоила количество ошибок моей страницы. если я использую
ptr[i+4096] = 'A'
Я получил 25 722 ошибок страницы с помощью инструмента perf, чего я и ожидал, но если я воспользуюсь
tmp = ptr[i+4096]
вместо этого количество ошибок страниц увеличилось до 51,322. Я не знаю, как это объяснить. Ниже приведен полный код. Спасибо!
void do_something() {
int i;
char* ptr;
char tmp;
ptr = malloc(100*1024*1024);
int j = 0;
int k = 0;
for (i = 0; i < 100*1024*1024; i+=4096) {
//ptr[i+4096] = 'A' ;
tmp = ptr[i+4096];
for (j = 0 ; j < 4096; j++)
ptr[i+j] = (char) (i & 0xff); // pagefault
}
free(ptr);
}
int main(int argc, char* argv[]) {
do_something();
return 0;
}
Информация о машине: Архитектура: x86_64 Операционные режимы ЦП: 32-разрядные, 64-разрядные Порядок байтов: Little Endian ЦП: 40 Список оперативных ЦП: 0-39 потоков на ядро : 2 ядра на сокет: 10 сокетов: 2 узла (ов) NUMA: 2 ID производителя: GenuineIntel Семейство процессоров: 6 Модель: 63 Название модели: Intel (R) Xeon (R) CPU E5-2687W v3 @ 3,10 ГГц Степпинг: 2 ЦП МГц: 3096,188 BogoMIPS: 6197,81 Виртуализация: Кэш VT-x L1d: 32 КБ кеш-памяти L1i: 32 КБ кеш-памяти L2: 256 КБ кеш-памяти L3: 25600 КБ NUMA node0 ЦП: 0-9,20-29 NUMA node1 ЦП: 10-19,30-39
3.10.0-514.32.3.el7.x86_64 #1
volatile
ни для чего, поэтому все будет оптимизировано, если компилируется с включенной нормальной оптимизацией (-O2 или -O3). Так что в любом случае вы сохраняете в стек, потому что ваши счетчики циклов не будут оптимизированы в регистры. В любом случае, я мог видеть лишний промах dTLB из-за сохранения в стек после того, как ошибка страницы изменяет таблицы HW-страниц для подключения новой страницы (если смягчение последствий Meltdown сделало недействительными TLB), но не дополнительную ошибку страницы. IDK, почему это могло произойти. - person Peter Cordes   schedule 05.09.2018tmp = ptr[i+4096]
будет оптимизирована, но, вероятно, не версия хранилища, потому что gcc не обнаруживает malloc / free без передачи указателя куда-либо как мертвое хранилище.) - person Peter Cordes   schedule 05.09.2018ptr[i+4096]
вызовет доступ к памяти вне допустимого диапазона на последней итерации цикла. - person Leo K   schedule 05.09.2018