ОК, извините мой первый ответ. Позднее я прочитал ваши последующие комментарии под вашим вопросом, поэтому теперь я понимаю, что вы хотите очистить INSTRUCTION CACHE, чтобы загрузить свою программу (или ее части) из кеша, чтобы при проверке ее производительности вы также тестировали его начальное время загрузки из основной памяти в кэш команд. Вам также нужно очистить любые данные, которые ваш код будет использовать в основной памяти, чтобы данные и код были свежими?
Прежде всего я хотел бы упомянуть, что основная память сама по себе также является формой кеша, а ваш жесткий диск (либо программа на диске, либо место подкачки на диске) является самым низким, самым медленным местом для вашей программы инструкции могут быть получены. Тем не менее, когда вы впервые запускаете процедуру в первый раз, если она еще не загружена в основную память с диска из-за того, что она находится рядом с другим уже выполненным кодом, тогда сначала должны быть загружены его команды CPU с диска. Это занимает порядка или больше дольше, чем загрузка его из основной памяти в кеш. Затем, как только он загружается в основную память, требуется примерно на порядок больше времени для загрузки из основной памяти в кеш, чем требуется для загрузки из кэша в сборщик команд процессора. Поэтому, если вы хотите проверить производительность вашего холодного запуска вашего кода, вам нужно решить, что означает «холодный старт» ... вытащить его из диска или вытащить его из основной памяти. Я не знаю никакой команды «вымыть» инструкции/данные из основной памяти, чтобы поменять местами, поэтому очистка до основной памяти примерно такая же, как вы можете (что я знаю), но имейте в виду что ваши результаты теста могут по-прежнему отличаться от первого запуска (когда он может вытащить его из диска) в последующие прогоны, даже если вы очистите кеш команд.
Теперь, как можно было бы промыть кеш инструкций, чтобы убедиться, что их собственный код выведен в основную память?
Если бы мне было нужно это сделать (очень странно, по моему мнению), я бы, вероятно, начинал с нахождения длины & приблизительного размещения моих функций в памяти. Поскольку я использую Linux, я бы выпустил команду «objdump -d {myprogram}> myprogram.dump.txt», тогда я бы открыл файл myprogram.dump.txt в редакторе и выполнил поиск функций, которые хочу сбросить и выяснить, как долго они вычитают свой конечный адрес из своего начального адреса, используя шестнадцатеричный калькулятор. Я бы записал размеры каждого из них. Позже я добавил вызовы cacheflush() в моем коде, указав ему адрес каждой функции, которую я хочу сбросить как «addr», и длину, которую я нашел как «nbytes», и ICACHE. Просто для безопасности я, вероятно, выдул бы немного &, добавив около 10% к размеру, на всякий случай, я сделаю несколько настроек к коду и забуду отрегулировать nbytes. Я бы сделал вызов cacheflush(), как это для каждой функции, которую я хочу отключить. Затем, если мне нужно также очистить данные, если они используют глобальные/статические данные, я могу их также очистить (DCACHE), но если это данные стека или кучи, реально нет ничего реалистичного, что я могу (или должен) делать для флеша что из кеша. Попытка сделать это будет упражнением в глупости, потому что это создаст условие, которое никогда или очень редко существовало бы при нормальном исполнении. Предполагая, что вы используете Linux ...
#include <asm/cachectl.h>
int cacheflush(char *addr, int nbytes, int cache);
...where cache is one of:
ICACHE Flush the instruction cache.
DCACHE Write back to memory and invalidate the affected valid cache lines.
BCACHE Same as (ICACHE|DCACHE).
BTW, это домашнее задание для класса?
Почему вы * необходимости * очистить кэш? –
Это требование для моего проекта, который включает в себя расчет времени, затраченного на мою логику, поэтому мне нужно сбросить кеш. –
Возможный дубликат http://stackoverflow.com/questions/1756825/cpu-cache-flush – Tudor