Инструкции prefetcht1 и prefetcht2 загружают данные в один лишь кэш второго уровня, не помещая их в кэш первого. Поскольку выгрузка буферов записи происходит в кэш второго уровня, минуя первый, то предвыборку соответствующих линеек в L1-кэш осуществлять нецелесообразно. Вот тут-то и пригодится prefetcht1/t2!
Размер загружаемых данных равен длине кэш-линеек соответствующей кэш-иерархии и составляют 32 байта ( в Plll и L2-, и L1- кэши имеют линейки по 32 байта).
Ни одна из команд предвыборки Р4 не позволяет загружать данные в кэш первого уровня. Все – и временные, и не временные данные помещаются лишь в кэш второго уровня – создатели процессора решили поступить именно так. Эффективность такой стратегии не бесспорна, но в любом случае время доступа к кэшу второго уровня намного меньше времени доступа к оперативной памяти, поэтому даже такая предвыборка значительно лучше, чем ничего.
Возникает вопрос: если все команды предвыборки помещают загружаемые данные в кэш второго уровня, то какая между ними разница? Между командами prefetcht0, prefetcht1 и prefetcht2 – действительно никакой. А вот команда prefetchnta отличается тем, что помещает загружаемые данные не в любой, а исключительно в первый банк кэша второго уровня (восьми-ассоциативный L2-кэш Р4 содержит восемь таких банков), благодаря чему prefetchnta никогда не вытесняет более 1/8 объема кэша второго уровня. Однократно используемы данные, как уже говорилось выше, действительно не должны вытеснять многократно используемые данные из верхних кэш-иерархий, но в Р4 такое вытеснение все же происходит, и предотвратить его, увы, нельзя. Причем вытесняются отнюдь не те ячейки, к которым дольше всего не было обращений, а линейки фиксированного банка, возможно интенсивно используемые обрабатывающем их приложением! Словом, в Р4 программная предвыборка реализована далеко не наилучшим образом.
Размер загружаемых данных равен длине линеек кэша второго уровня, что составляет 128 байт.
Различия в реализации предвыборки на Р!!! и Р4 существенно затрудняют оптимизацию приложений, поскольку каждый процессор требует к себе индивидуального подхода. Для достижения максимальной эффективности все критические процедуры рекомендуется реализовывать как минимум в двух вариантах – отдельно для Р!!! и отдельно для Р4. В противном случае, либо Р!!! чрезвычайно тормозить, либо Р4 не раскроет подлинного потенциала своей производительности. Учитывая существование К6/Athlon, вариантов реализации набирается уже четыре. Не слишком ли много головной боли для программистов? Нет, это вовсе не призыв к отказу от предвыборки – ведь программисты, как и комсомольцы, легкими путями не избалованы.
Эффективность предвыборки в многозадачных системах
Процессы, исполняющиеся в многозадачных системах, владеют кэш-памятью не единолично, а вынуждены делить ее между собой? Снижает ли это эффективность предвыборки? Эффективность предвыборки в кэш первого уровня – однозначно нет. Промежуток времени между переключениями задач – это целая вечность для процессора, соответствующая, по меньшей мере, миллионам тактов. В любом случае, независимо от того, будет ли вытеснено содержимое L1-кэша или нет, - предвыборка позволяет конвейеризировать загрузку данных из памяти, предотвращая тем самым возможное падение производительности.
С L2-кэшем ситуация не так однозначна. Если оптимизируемый алгоритм позволяет распараллелить загрузку данных с их обработкой, то состояние L2-кэша вообще не играет никакой роли, поскольку быстродействие программы ограничивается именно скоростью вычислений, а не пропускной способностью подсистемной памяти. Однако если время обработки данных меньше времени их загрузки из основной памяти, падения производительности никак не избежать. Предвыборка, конечно, увеличит производительность программы и в этом случае, но, увы, ненамного – максимум в два-три раза.
С другой стороны, одновременное выполнение двух или более приложений, интенсивно обменивающихся с памятью, на рабочих станциях случается очень редко (для серверов, правда, это – норма жизни). В большинстве случаев пользователь активно работает лишь с одним приложением, другие же находятся в фоне и довольствуются минимальным количеством памяти, а порой и вовсе «спят», не трогая L2-кэш и практически не снижая эффективности предвыборки.