Кое-что о кэше
Уже довольно долгое время меня занимает одна малопонятная мне ситуация, связанная с кэшем второго уровня процессора AMD Athlon 64. Недоумение вызывают как площадь кэша второго уровня, так и скоростные показатели шины между кэшеми первого и второго уровня.
Но обо всем по порядку. Относительный размер кэша второго уровня в кристалле К8 весьма велик. Достаточно сказать, что кэш 1МВ в ядре К8 занимает примерно такую же площадь, как и остальное ядро, то есть почти 50% площади. Для ядра San Diego, имеющего площадь порядка 100 кв. мм., площадь одного мегабайта кэша составляет примерно 50 кв. мм.
В то же самое время результаты Intel в деле размещения кэша на кристалле намного лучше. В частности, площадь ядра Dothan составляет чуть более 90 кв. мм., из которых кэш размером 2МВ занимает примерно 55 кв. мм.! То есть плотность кэша в ядре Dothan практически в два раза выше. Это притом, что ячейки кэша и AMD и Intel делают по одинаковой технологии, и с примерно одинаковыми характеристиками.
Другими словами, ячейки кэш-памяти Intel умеет упаковывать гораздо лучше, чем AMD. Странная ситуация. Тем более странная, что у AMD давно есть вполне подходящий патент (SRAM formation using shadow implantation), в котором описывается возможность сделать ячейку кэш-памяти на 40% – 50% меньше (!) по площади, при этом еще и выиграв в ее быстродействии.
В результате хочется поинтересоваться: а доколе, собственно, столь полезный патент будет пылиться на полке? Ведь чем больше площадь процессора (каковая зависит в том числе и от площади кэша), тем меньше процессоров удастся произвести с одной пластины. Кто там жаловался на нехватку процессоров? Так вот же явные резервы увеличения выпуска, в чем же проблемы?
Но ненормально большая площадь кэша второго уровня не единственная странность. В конце концов, AMD сама решает, что ей делать с местом на кристалле.
Не составляет секрета, что основным рабочим кэшем является кэш первого уровня. Именно к нему, имеющему наименьшее время доступа, обращаются за данными исполнительные устройства. Соответственно, если данных в кэше первого уровня нет, процессор ищет их в следующей иерархии памяти, кэше второго уровня. С достаточно высокой вероятностью они там окажутся. И возникнет необходимость передать их в кэш первого уровня, причем как можно быстрее.
И вот тут-то и возникает вопрос.
До каких пор, позвольте спросить, у AMD будет столь медленная шина между кэшем второго и первого уровней? Нешто нельзя сделать аналог технологии Advanced Transfer Cache от Intel? Это такая неразрешимая проблема? Напомню, что Intel умудрилась справиться с созданием 256-битной шины, работающей каждый второй такт, еще в ядре Coppermine давно «почившего в бозе» процессора Pentium III, а AMD до сих пор даже в новых ядрах обходится двумя 64 битными шинами между двумя иерархиями кэшей. При этом максимальная производительность их равна 64 бита на запись и 64 бита на чтение за такт. Да, они могут работать одновременно, спорить не стану. Но все равно это только 128 бит за такт, то есть уровень процессора Pentium III. В процессоре Pentium 4 Intel умудрилась еще раз вдвое увеличить скорость передачи из кэша второго уровня, до 256 бит каждый такт. И это несмотря на то, что частота работы Pentium 4 заметно выше, чем у Athlon 64/Opteron, а разгонять широкую шину по частоте – более чем непросто.
Неужели невозможно расширить эту шину? В конце концов, для кого-то загадка, что процессоры Pentium 4 иногда выигрывают в некоторых программах просто за счет того, что полоса пропускания их кэша второго уровня намного выше? В частности, есть прямая зависимость от скорости кэша у большинства потоковых алгоритмов. Да и архиваторы обычно зависят от скорости обмена данными между уровнями кэшей.
Самое анекдотичное, что требование расширить шину между кэшами первого и второго уровней на фоне перехода на AMD64 выглядит достаточно логично. Ведь и размер данных, и размер команд увеличиваются по сравнению с 32-битными аналогами, пусть и не намного. Следовательно, нагрузка на шину растет. А в данном случае AMD даже не почесывается. Мол, и так все хорошо.
...
Отсутствие прогресса в деле улучшения кэша особенно грустно оттого, что AMD уже несколько раз меняла поколения ядер. И при переходе технологического процесса на нормы 90нм, который произошел относительно недавно, сделать мелкие (минорные) исправления ядра было бы очень логично. Я уж молчу, что, по сути, на техпроцессе 90нм поколений ядер было два: ядро Winchester было заменено ядром Venice. Что, оба раза не до этого было?
Попутно это дало бы некоторый прирост производительности, который осторожно можно оценить диапазоном 0% - 10% (по аналогии с приростом скорости в ядре Pentium III Coppermine). Мало? Да, не слишком много. Между прочим, от замены процессора на следующую, более высокую модель, прирост часто меньше. А в некоторых алгоритмах, связанных, например, с медиакодированием, высокая пропускная способность шины между иерархиями кэшей позволяет добиться 20% - 30% прироста. Все еще плохо и мало?
И действительно, ну зачем нам такой прирост? Что с ним потом делать? Совершенно непонятно!
...
Что ж, поживем – увидим. В любом случае, если с эксклюзивностью кэша еще возможны варианты, пропускную способность шины между кэшами первого и второго уровня увеличить следовало давно. Просто потому, что нет ни одной ситуации, когда это ухудшило бы производительность. А вот ситуаций, когда улучшило бы – хватает. В частности, расширение двух имеющихся шин с 64 бит до 128 и, главное, конвейеризация запросов в L2 были бы совсем не лишними.
То, что это не сделано до сих пор – явная недоработка.