ТЕХНИКА ОПТИМИЗАЦИИ ПРОГРАММ

Вычисление полного времени доступа


Теперь, познакомившись с механизмом взаимодействия оперативной памяти и процессора, мы можем рассчитать реальную пропускную способность при чтении зависимых данных. Итак, мысленно прокрутим процесс обмена еще раз…

·         получив запрос на чтение ячейки, процессор выполняет арбитраж и передает чипсету адрес и длину запрошенного блока памяти. При условии, что шина свободна, эта операция укладывается в четыре такта;

·         контроллер шины, получив запрос, ставит его в очередь и, если контроллер памяти свободен, передает ему запрос с началом следующего такта;

·         в течение следующего такта контроллер памяти декодирует адрес и ставит его в свою внутреннею очередь запросов на чтение памяти;

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

                                                        I.      если соответствующая страница открыта и банк памяти не находится на регенерации, – чипсет выставляет сигнал CAS и передает сокращенный адрес ячейки. Спустя 2-3 такта частоты памяти на шине появляются первая порция считанных данных;

                                                      II.      контроллер памяти считывает ее за один такт;


§         синхронный контроллер памяти с началом следующего такта передает считанные данные контролеру шины и в дальнейшем пересылка осуществляется параллельно с чтением, но с задержкой в один такт;

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

§         примечание: Некоторые дешевые чипсеты, в частности VIA KT133/KT266, осуществляет передачу данных внутри чипсета только по фронту импульса, что полностью обесценивает все преимущества шины EV6, на которой работает Athlon, и ее эффективная часта (определяемая, как известно, самым узким местом системы) оказывается равной всего 100/133 MHz.

§         примечание: если длина запроса превышает длину пакета, то независимо от типа контроллера памяти, данные всегда передаются через временный буфер.

                                                   III.      на чтение "хвоста" пакета в зависимости от его длины уходит еще три или семь тактов частоты оперативной памяти;



                                                    IV.      если длина запроса превышает длину пакета, то мы возвращаемся к пункту I.



                                                      V.      контроллер шины, получив считанные данные, формирует запрос на передачу данных от чипсета к процессору и ставит его в очередь, на что расходуется один такт;

                                                    VI.      если в очереди не находится ничего другого, и шина никем не занята, контроллер шины извлекает запрос из очереди и "выстреливает" его в шину, передавая за один такт одну, две или четыре порции данных (на K6/P-II/P-III, Athlon и P-4 соответственно).

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

                                               VIII.      Все! Остается лишь добавить латентность кэш-контроллеров всех иерархий и латентность самого процессора, – но это уже тема другого разговора, к оперативной памяти прямого отношения не имеющая.



·         если требуемая DRAM- страница закрыта, но банк не находится на регенерации, контроллер памяти передает адрес строки, вырабатывает сигнал RAS, ждет 2 или 3 такта пока микросхема его "переварит", и переходит к сценарию I.

·         если же банк находится на регенерации, контролеру приходится подождать от одного до трех тактов пока она не будет завершена.

Конечно, это только приблизительная схема, не учитывающая конструктивные особенности отдельных наборов системных логик. Так, например, чипсеты от nVIDIA оснащены двумя независимыми контроллерами памяти, общающиеся со "своими" модулями памяти, в результате чего запросы от AGP-карты исполняются параллельно с запросами процессора, уменьшая тем самым латентность чипсета. Но самое интересное – Dynamic Adaptive Speculative pre-Processor /DASP/ (адаптивная система динамической упреждающей предвыборки), распознающая регулярные шаблоны обращения к памяти и заблаговременно осуществляющая предвыборку требуемых ячеек во внутренний буфер, расположенный где-то поблизости от контроллера шины (где именно – компания умалчивает, да это, собственно, и не важно).

Бессмысленно таким образом выводить общую форму вычисления латентности некоторого "обобщенного" чипсета. Потребуется, как минимум, знать его основные характеристики, которые, кстати, в документации отсутствуют. С другой стороны, все же полезно знать степень влияния тех или иных факторов на производительность системы, и мы отважимся написать такую программу, заранее оговорив ее ограниченность.

Полный исходный текст читатель найдет в файле "Memory/speed.exactly.c", в книге же ради экономии места приведен лишь ее ключевой фрагмент. Рассмотрим его (см. листинг 1).

// вычисление пропускной способности оперативной памяти с учетом латентности чипсета

C = (N /* разрядность памяти, байт */ * BRST_LEN /* длина пакета, итер */) /

(



  2/FSB                                         /* арбитраж                       */

+ 1/FSB                                         /* передача адреса ячейки         */

+ 1/FSB                                         /* передача идентификатора транзакции    */

+ 1/FSB                                         /* латентность BIU                */

+ 1/FSB                                         /* декодирование MCT адреса ячейки */

+ 1/FSB                                         /* латентность MCT                */

+ Chipset_penalty/Fm                     /* пенальти на согласов. частот Mem/FSB*/

+ BRST_NUM*CAS_latency/Fm                /* CAS Delay                      */

+ (fSrl?BRST_LEN/Fm:1/Fm)                /* передача данных от DRAM к BUFF/BIU    */

+ Chipset_penalty/FSB                           /* пенальти на согласование частот */

+ (fMCT2BIUparallel?BRST_LEN/FSB:1/FSB)  /* передача данных от BUFF к BIU  */

+ 1/FSB                                         /* латентность BIU                */

+ (fImmediately?1/FSB:BRST_LEN/Ftransf)  /* передача данных от BIU к CPU   */

+ CPU_latency/Fcpu                       /* латентность СPU                */

+ X_CACHE*BRST_LEN/Fcpu                  /* передача данных от L2 к L1            */

+ CPU_penalty/Fcpu                       /* пенальти на согласов. частот CPU/FSB*/

+ RAS_latency/((LEN_page*K/(N*BRST_LEN))*Fm)    /* задержка на открытие страницы памяти*/

+ (fInterleaving?0:RAS_precharge/Fm)            /* задержка на перезарядку банка  */

);

Листинг 1 [Memory/speed.exactly.c] Фрагмент программы измерения реальной пропускной способности памяти с учетом латентности чипсета и CPU

Сразу видно, что величина RAS to CAS Delay при последовательном доступе к ячейками на производительность практически не влияет и ей можно пренебречь. Время перезарядки банка (RAS Precharge) за счет чередования банков и вовсе маскируется, поэтому, при последовательном доступе не играет никакой роли.

Величина CAS Delay, будучи много меньше общей латентности чипсета, очень незначительно влияет на производительность системы, особенно на AMD Athlon, где одним CAS Delay считывается восемь порций данных из памяти (на P-II/P-III лишь четыре).

Таким образом основной фактор, определяющий производительность, это (за исключением архитектуры чипсета) – частота работы памяти

и частота передачи данных по системной шине

(при условии, что внутри чипсета данные перемещаются с не меньшей скоростью, – в противном случае частота системной шины утрачивает свою определяющую роль).


Содержание раздела