Эффективность использования кэша

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

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

отображаемые в тот же самый набор, прежде чем команда будет замещена. Если

Адрес

0x0100 lcntr = 1024, do tight until lce;

0x0101 r0 = dm (i0, m0), pm (i8, m8) = f3;

0x0102 r1 = r0-r15;

0x0103 if eq call (sub);

0x0104 f2 = float r1;

0x0105 f3 = f2*f2;

0x0106 tight: f3 = f3 + f4;

0x0107 pm (i8, m8) = f3;

·

·

·

0x0200 sub: r1 = R13;

0x0201 r14 = pm (i9, m9);

·

·

·

0x0211 pm (i9, m9) = r12;

·

·

0x021F rts;

Рис. 3.16. Код, в котором неэффективно используется кэш

все три команды, отображенные в одном и том же наборе, необходимы неоднократно, то эффективность использования кэша (то есть «степень удачного обращения») может стремиться к нулю. Решение заключается в том, чтобы переместить одну или более команд по новому адресу, который отобразится в другом наборе.

Пример кода, в котором неэффективно используется кэш, показан на рис. 3.16. Обращение к данным памяти программы по адресу 0x101 в цикле tight вызывает команду по адресу 0x103, которую нужно кэшировать (в наборе 3). Каждый раз, когда вызывается подпрограмма call, при обращении к данным памяти программы по адресам 0x201 и 0x211 эта команда замещается, загружаются команды по адресам 0x203 и 0x213 в набор 3. Если во время выполнения цикла

подпрограмма вызывается редко, влияние на эффективность кэша будет минимально. Если подпрограмма вызывается часто, влияние будет заметным.

Если выполнение цикла критично ко времени, было бы желательно переместить подпрограмму на одну ячейку (начиная с 0x201) так, чтобы две кэшируемых команды помещались в 4_й набор вместо 3_го.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: