Можно ли привязать ячейку памяти к кешу? - PullRequest
0 голосов
/ 26 ноября 2011

Возможно, что переменная в программе пользовательского пространства зафиксирована в местоположении кэша?

Ответы [ 3 ]

3 голосов
/ 26 ноября 2011

@ MetallicPriest, вы продолжаете задавать загадочные вопросы без мотивации их достаточно ..... Вы должны попробовать , задавая вопросы здесь, чтобы задатьвопрос с короткой и точной фразой - вы делаете это очень хорошо - а затем , чтобы мотивировать и дать контекст вашего вопроса в целом параграфе (вы никогда этого не делаете, и вам действительно следует).Если возможно, укажите также текущее состояние вашего таинственного программного обеспечения (например, общедоступный репозиторий GIT).

AFAIK, для прикладной программы в Linux (не менее x86 или AMD64), кэш процессора (если онэтот кеш, о котором вы говорите) почти не существует (то есть на самом деле не виден с точки зрения приложения).

Однако процесс может (или нет) иметь некоторые машинные инструкции для работы с кешем,AFAIK, это зависит от модели (т. Е. Процессор AMD Phenom может вести себя не так, как Intel i7).

К счастью для вас, последний компилятор GCC способен (при оптимизации) для генерации инструкций, связанных с кешем .Он также дает вам встроенных в кеш встроенных таких как __builtin___clear_cache или __builtin_prefetch.Однако следует помнить, что эти встроенные функции имеют неточное значение и реализованы различными способами, и, вероятно, зависят от ваших опций оптимизации и ваших специфических для цели опций , присвоенных gcc

И, вероятно, атрибут volatile в GCC может помочь вам при кэшировании («удалив» его).

Наконец, переменная (в прикладной программе в Linux) не всегда может оставаться в кэше,Например, поскольку переключение контекста инициируется ядром, строка кэша будет время от времени использоваться другим процессом (и его данными).На самом деле, ядро ​​даже иногда перемещает активный процесс с одного ядра на другое вашего многоядерного настольного процессора!

2 голосов
/ 26 ноября 2011

В общем, это возможно сделать на большинстве современных процессоров;либо с помощью явной поддержки в ЦП (которую не поддерживает 80x86), либо путем взлома (например, загрузка его в кэш и затем отключение заливки строк в кэш-памяти в современных 80x86), или путем предотвращения того, чтобы другие данные вызывали строки / строки кешабыть выселенным через.другие средства (например, регулярно отбрасывать дневной свет из ЦП с помощью CLFLUSH).

Однако «в целом» не означает «специально для Linux».Я сомневаюсь, что Linux поддерживает эти вещи, особенно для процессов в пользовательском пространстве.

Причина, по которой я сомневаюсь, что Linux поддерживает это, заключается в том, что нет никакой разумной причины для поддержки Linux (или любой другой ОС общего назначения).Если что-то используется регулярно, то оно все равно будет в кеше процессора;и если что-то не используется регулярно, то вы не хотите, чтобы это занимало место в кеше и замедляло все остальное.

На самом деле есть только 3 вменяемые причины.Первый - это код прошивки, который запускается до инициализации микросхем ОЗУ (что, я сомневаюсь, применимо здесь).Вторая причина - экстремальное «тяжелое реальное время», когда дополнительная задержка при пропадании кэша не может быть допущена (что, я сомневаюсь, применимо здесь и, вероятно, не применимо ни к чему другому).Третья причина заключается в том, чтобы обойти особые случаи, когда обычная политика использования кэшей с «наименьшим количеством использований в последнее время» приводит к проблемам (таким как загрязнение кэша), где есть гораздо лучшие способы устранения / предотвращения этих проблем (например, предотвращение кэширования ненужных данных,или сбросить его вскоре после того, как он попадет в кеш).

По сути, я предлагаю вам подумать, что вы можете заставить что-то оставаться в кеше, но на самом деле вы не хотите заставлять что-либооставайся в кеше.

0 голосов
/ 26 ноября 2011

Извините, чувак, но, насколько я знаю, это нельзя сделать в пространстве пользователя, а только в пространстве ядра.

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