Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
6 / 6 / 2
Регистрация: 09.02.2016
Сообщений: 138

Узнать, находится ли в кеше процессора переменная?

08.08.2017, 16:44. Показов 3133. Ответов 44
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.

Есть ли возможность узнать, находится ли в кеше процессора переменная?
Время доступа к ней постоянно "пляшет". То быстро, то очень долго, хотелось бы выявить точную причину.

gcc 4.8

Добавлено через 47 минут
Частично помогло выравнивание структуры. Сократило большую задержку вдвое.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.08.2017, 16:44
Ответы с готовыми решениями:

Сколько раз находится одна и таже переменная в строчке?
Привет. У меня возникла проблема. В моём Матлаб коде я генерирую себе из файла код ассемблера, который хочу анализировать. Этот код Матлабу...

Переменная не выводится, если определенная строка находится в теле условия
Привет! Помогите понять почему переменная не выводится , если строка $user = $_SESSION; находится в теле условия. А если вынести эту...

Пустая переменная,как узнать ее значение?
Вопрос несколько коварный))) Всем наверно известно о интернет-тестах,для студентов например. Режим самообучения - в конце кода страницы...

44
6 / 6 / 2
Регистрация: 09.02.2016
Сообщений: 138
15.08.2017, 15:59  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Вованя Посмотреть сообщение
у тогда может вообще имеет смысл привязать процесс к конкретному процессору(ядру),
на тестах я всегда так делаю. Полностью освобождаю ядро от лишних процессов и делаю привязку.
по моему опыту, это достаточно сильно влияет. Много тестировал.
0
153 / 148 / 66
Регистрация: 20.02.2014
Сообщений: 556
15.08.2017, 16:00
Evg, в общих чертах да, все верно говорите, но сейчас то речь о конкретной задаче, и не каждому менять придется найс.
Да и в общем это просто как suggestion, а не призыв к действию.

Добавлено через 14 секунд
Evg, в общих чертах да, все верно говорите, но сейчас то речь о конкретной задаче, и не каждому менять придется найс.
Да и в общем это просто как suggestion, а не призыв к действию.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21286 / 8311 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
15.08.2017, 16:10
Цитата Сообщение от stima Посмотреть сообщение
С этим явно можно поспорить. context switches и preemtion убирается изолированием ядра от кернела (isolcpus) и привязываение 1 задача 1 ядро, тушением ненужных kworker, балансеров и тому подобных (стандартные патчи для rtos). interrupts просто муваются на другие cpu или тушатся патчами (rtos).
Цитата Сообщение от Вованя Посмотреть сообщение
Evg, в общих чертах да, все верно говорите, но сейчас то речь о конкретной задаче, и не каждому менять придется найс
Да, согласен. Обработкой прерываний в многоядерной системе по логике должно заниматься только одно ядро. Тогда действительно nice + taskset -c должны нормально работать без дополнительных приседаний

Цитата Сообщение от stima Посмотреть сообщение
Это тоже менеджется - данные то пренадлежат Вам - а значит и можете им косвенно управлять
Смысл не понял, а потому на всякий случай пока не соглашусь
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
15.08.2017, 16:33
Смысл в том, что CPU работает над данными которыми Вы ему даете (нет магии), а значит Вы можете сказать будут ли Ваши данные в кеше, в том или иной момент.
0
6 / 6 / 2
Регистрация: 09.02.2016
Сообщений: 138
15.08.2017, 16:38  [ТС]
Цитата Сообщение от stima Посмотреть сообщение
Смысл в том, что CPU работает над данными которыми Вы ему даете (нет магии), а значит Вы можете сказать будут ли Ваши данные в кеше, в том или иной момент.
у меня получилась интересная ситуация.

Если взять за то, что в кэш из памяти читается объем равный кэш линии, то в принципе все хорошо. Когда я беру нужный элемент массива, то по идее и последующие N элементов тоже попадают в кэш (в пределах кэш линии).

И я столкнулся с тем, что что концовки массивов из за неправильного выравнивания лежали в другой области памяти. Последовательность нарушалась. И при обращении к этому куску я испытывал всплески по времени доступа, так как из за нарушения последовательности хранения в памяти, закешированности не было. Тут я уже доскональна свою ситуацию разобрал.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21286 / 8311 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
15.08.2017, 16:40
prefetch как раз и нужен для того, чтобы быть уверенным, что данные с очень большой вероятностью попадут в кэш к тому моменту, когда они реально понадобятся. Разумеется, при условии правильного использования prefetch'ей. Если читать данные в следующем такте после prefetch'а, то толку от prefetch'а не будет. Точно так же если читать данные через миллион тактов
0
6 / 6 / 2
Регистрация: 09.02.2016
Сообщений: 138
15.08.2017, 16:52  [ТС]
Чтобы не плодить тем, в продолжении темы.

Если вызывать метод какого то класса, то первый вызов всегда будет долгим. И долгим будет не именно выполнение этого метода, а именно вызов.
Сразу последующие вызовы происходят мгновенно.

У меня на уме только две причины:
1) Параметры метода нужно засунуть в стек. Это опять же вытащить их из памяти.
2) Я так понимаю у каждого метода тоже есть свои адреса. И доступ к нему то же время.

Может есть соображения, как от этой задержки уйти? Понимаю, что можно метод держать "горячим", вызывать его в холостую каждый N интервал времени. Но может есть покрасивее вариант, на примере того же prefetch?
(в prefetch я уже побывал передать адрес метода, пока не закомпилилось)
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21286 / 8311 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
15.08.2017, 17:14
Тут по идее речь идёт о кэше инструкций. Толком ничего по этому поводу не нашёл. Возможно, из-за того, что предподкачка может выполняться другими средствами. Читал как-то описание, не факт, что оно от интела, но вполне возможно, что на разных процессорах сделано более-менее одинаково

Когда операция call исполнилась в первый раз, то в специальную табличку заносится пара адресов: адрес самОй команды call и адрес, куда случился переход (вызов). Далее когда этот же самый call исполняется второй раз, то случается следующее. Как только call попадает в конвейер, то происходит проверка в табличке. Там видно, что в недалёком прошлом из этого адреса случился переход на такой-то адрес. Это выясняется очень рано - чуть ли не раньше стадии fetch в конвейере. Т.е. исполнительное устройство ещё не знает, что за операцию мы тут будем исполнять, но механизм с табличкой уже сработал и говорит о том, что недавно из этого адреса был переход на метод. И в этот самый момент включается предподкачка к кэш инструкций. Т.е. к моменту, когда операция call дошла до стадии исполнения (а на это в конвейере уходит довольно много тактов) по адресу перехода код уже либо попал в кэш, либо близок к этому. Если код по этому адресу изменился и это была не операция перехода или переход по другому адресу - ну извиняйте, не угадали

Но не помню, какими умными словами сия нанотехнология называется
2
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
15.08.2017, 17:17
Что-бы убрать задержку, Вам нужно точно знать что ее вызывает. Исползуйте systemstap(dtrace), ftrace что-бы посмотреть поначалу не ядро ли это (не происходит ли cs/page fault/interrupt).
В конкретно описанном Вами случае звучит как page_fault
C++
1
2
A *a = new A(); // выделили память
a->foo();; //page fault
1
153 / 148 / 66
Регистрация: 20.02.2014
Сообщений: 556
15.08.2017, 17:17
karat39, это понятие локальности кода. Кеш так же существует и для кода. Когда по коду меньше ветвлений if-ов и длинных переходов, то кеш кода практически так же работает, как и кеш данных - рядом идущие инструкции кешируются. Почитай про __builtin_expect(), например.
1
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
15.08.2017, 17:19
Цитата Сообщение от Evg Посмотреть сообщение
Но не помню, какими умными словами сия нанотехнология называется
Это и называется prefetch. А то что вы описали это называется branch prediction.
0
153 / 148 / 66
Регистрация: 20.02.2014
Сообщений: 556
15.08.2017, 17:21
Цитата Сообщение от Evg Посмотреть сообщение
Но не помню, какими умными словами сия нанотехнология называется
Не branch-prediction ли?
0
6 / 6 / 2
Регистрация: 09.02.2016
Сообщений: 138
15.08.2017, 17:23  [ТС]
Всем спасибо. Исследую, о результатах доложу.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21286 / 8311 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
15.08.2017, 17:37
Цитата Сообщение от stima Посмотреть сообщение
В конкретно описанном Вами случае звучит как page_fault
При вызове a->foo в принципе не может случиться page fault, поскольку тут нету чтений из памяти, тут есть непосредственный call (исходим из того, что это НЕ виртуальный метод)

Хотя, возможно ты имел в виду page miss. Это тоже может влиять

Цитата Сообщение от stima Посмотреть сообщение
А то что вы описали это называется branch prediction
Цитата Сообщение от Вованя Посмотреть сообщение
Не branch-prediction ли?
Не. Branch prediction пытается угадать, будет УСЛОВНЫЙ переход, или не будет. А здесь речь идёт о безусловном переходе. Хотя логично было, чтобы branch prediction опирался на ту же технологию. Т.е. если переход случился - занесли в табличку, если переход не случился - удалили из таблички, или что-то типа того. Но, на моей памяти, с механизмом branch prediction ассоциирован ещё и некий счётчик, который отслеживает динамику нескольких последних исполнений (т.е. чего было больше: переходов или провалов). Т.е. по состоянию счётчика происходит предсказание, а по значению текущего адреса - подкачка. Ну или что-то в этом духе
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
16.08.2017, 11:50
Цитата Сообщение от Evg Посмотреть сообщение
При вызове a->foo в принципе не может случиться page fault, поскольку тут нету чтений из памяти, тут есть непосредственный call (исходим из того, что это НЕ виртуальный метод)
В Вашем понимании, вызов функции это процедура перехода на ее адресс, т.е. asm call. В моем понимании, это не только процедура перехода на адресс, но и работа самой функции, в том числе возможное обращение по указателю this что есть page_fault.
0
Evg
16.08.2017, 11:56

Не по теме:

Цитата Сообщение от stima Посмотреть сообщение
в том числе возможное обращение по указателю this что есть page_fault
page fault - это обращение по недопустимому адресу. В этом коде его нет

0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
16.08.2017, 12:02
Цитата Сообщение от Evg Посмотреть сообщение
page fault - это обращение по недопустимому адресу.
A page fault (sometimes called #PF, PF or hard fault[a]) is a type of exception raised by computer hardware when a running program accesses a memory page that is not currently mapped by the memory management unit (MMU) into the virtual address space of a process.

https://en.wikipedia.org/wiki/Page_fault

Цитата Сообщение от Evg Посмотреть сообщение
В этом коде его нет
В этом коде это в каком коде?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21286 / 8311 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
16.08.2017, 12:05
Цитата Сообщение от stima Посмотреть сообщение
A page fault (sometimes called #PF, PF or hard fault[a]) is a type of exception raised by computer hardware when a running program accesses a memory page that is not currently mapped by the memory management unit (MMU) into the virtual address space of a process.
Ровно то же самое, что сказал я

Цитата Сообщение от stima Посмотреть сообщение
В этом коде это в каком коде?
Очевидно в каком - в коде из поста #29
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
16.08.2017, 12:17
Давайте разбиратся.
1. Выделение через new это выделение виртуального адресса?
2. Возможное обращение по this в функции нужно замапить на реальный адресс?

п.с. Даже так. Я забыл про конструктор pf будет на конструкторе.

Добавлено через 5 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <stdio.h>
#include <unistd.h>
 
#include <sys/sdt.h>
#include <sys/types.h>
#include <sys/syscall.h>
 
struct A
{
    void foo()
    {   
        a = 42; 
    }   
 
    int a;
};
 
int main()
{
    pid_t x = syscall(__NR_gettid);
 
    DTRACE_PROBE1(pf_test, thread_id, (int)x);
    DTRACE_PROBE(pf_test, begin);
    A *a = new A;
    a->foo();
    DTRACE_PROBE(pf_test, end);
    printf("a: %p\n", a); 
    return 0;
}
 
thread id 25394
fault address: 0x601008, symbol: 0x601008, access: w, type: minor, delay: 4
 
a: 0x601010
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#! /usr/bin/env stap
 
global fentry_time, fexit_time, faddress, fsymbol, faccess, ftype
global thread_id, dump, fdumped
 
probe process("pf_test").mark("thread_id")
{
    thread_id = $arg1
    printf("thread id %d\n", thread_id)
}
 
probe process("pf_test").mark("begin")
{
    dump = 1 
    fdumped = 1 
}
 
probe process("pf_test").mark("end")
{
    dump = 0 
 
    if (!fdumped)
    {   
        e = fexit_time - fentry_time
        printf("fault address: %p, symbol: %s, access: %s, type: %s, delay: %d\n",
            faddress, fsymbol, faccess, ftype, e)
        fdumped = 1 
    }   
}
 
probe vm.pagefault
{
    if (!(dump && tid() == thread_id)) next
 
    fentry_time = gettimeofday_us()
    faddress = address
    fsymbol = usymdata(address)
    faccess = write_access ? "w" : "r" 
}
 
probe vm.pagefault.return
{
    if (!(dump && tid() == thread_id)) next
    fexit_time = gettimeofday_us()
 
    if (vm_fault_contains(fault_type, VM_FAULT_MINOR))
    {   
        ftype = "minor"
    }   
    else if (vm_fault_contains(fault_type, VM_FAULT_MAJOR))
    {   
        ftype = "major"
    }   
    else
    {   
        next #only want to deal with minor and major page faults
    }   
 
    fdumped = 0 
}
Добавлено через 40 секунд
Короче основная идея была в том, что перед тем как лезть в ЦПУ. Нужно подумать о ядре.
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21286 / 8311 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
16.08.2017, 12:24
Цитата Сообщение от stima Посмотреть сообщение
1. Выделение через new это выделение виртуального адресса?
Естественно. Пользовательское приложение кроме как по виртуальным адресам обращаться не может

Цитата Сообщение от stima Посмотреть сообщение
2. Возможное обращение по this в функции нужно замапить на реальный адресс?
Нужно

В моём понимании тут дело такое:

1. Если виртуальный адрес некорректный (т.е. не было выделено виртуальной страницы с таким адресом), то вызывается page fault и приложение убивается
2. Если физическая страница, соответствующая виртуальному адресу, в памяти отсутствует (т.е. либо ещё не было ни одного обращения, либо она в swap'е), то случается page miss, после чего передаётся управление в ОС, а там происходит выделение или подкачка нужной физической страницы

Думается, тебе это всё и так известно. И начинают меня терзать сомнения насчёт того, что тут исключительно вопрос терминологии. Возможно, что в разной литературе (а может даже и в разных ОС) одни и те же вещи называют разными словами
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.08.2017, 12:24

Узнать с каким значением переменная IncreaseUserVa
Здравствуйте!! Ребята, подскажите по такому вопросу. В интернете на форумах есть описание того, как можно заставить Windows 7, а именно...

Как правильно указать что переменная типа integer находится в диапазоне чисел от 1 до 16 и является чётной?
Здравствуйте. Как правильно указать что переменная типа integer находиться в диапазоне чисел от 1 до 16 и является чётной? begin for...

Как узнать что переменная равна -1.#IND
Использую функцию atof(); чтобы преобразовать строку в переменную типа double Но иногда эта функция присваивает переменной double...

Узнать в какой области видимости объявлена переменная
Салют, народ. Прислали мне какое-то мутное тестовое задание. Нужно при создании/объявлении объекта как-то узнать в какой области видимости...

Как узнать содержит ли переменная необходимый текст?
В переменную &quot;str_1&quot; программа собирает текст. В результате str_1 = &quot;текст_1, текст_2, текст_3&quot;. В переменную...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru