Выбрать главу
Терапроцессоры

Если клэйтроника на Форуме все-таки проходила под грифом экзотической диковинки, то о терапроцессорах, позволяющих на старой технологии за счет радикально новых идей получить на один-два порядка большую производительность, нежели у традиционных «многоядерников», говорили более чем серьезно — эта тема составляла содержание не только презентаций, но и технических сессий для профессионалов. Впрочем, главная идея здесь тоже далеко не нова и даже вполне процветает в коммерчески выпускаемом «железе», начиная с Cell и заканчивая специализированными сопроцессорами от ClearSpeed. Ее суть в том, чтобы заменить одно сложное ядро (на котором вычислительные блоки нередко занимают менее 10% площади кристалла, а остальное уходит на то, чтобы вовремя подготовить для этих 10% данные и инструкции) набором из, скажем, пяти более простых, в каждом из которых вычислительные блоки займут половину площади ядра. Естественно, загрузка этих блоков из-за простоты обслуживающей их электроники будет невысока, а потому их быстродействие — заметно ниже, но потенциальный выигрыш за счет пятикратного увеличения числа вычислительных ресурсов перекроет все. Побочные эффекты — увеличение тактовой частоты (за счет упрощения) и снижение тепловыделения (за счет него же) — тоже играют на руку подобному подходу. И все было бы замечательно… если б не необходимость заставлять работать эти десятки процессорных ядер «в одной упряжке». Даже оставляя в стороне вопросы программирования параллельного ПО для десятков специализированных ядер, необходимо с достаточной скоростью читать и записывать обрабатываемую ими информацию и передавать ее на другие устройства — в противном случае наш терапроцессор будет большую часть времени ожидать новую порцию данных, и все его быстродействие сойдет на нет.

То, что предлагает Intel, как ни крути, сильно напоминает Cell, только с гораздо большим количеством ядер: если в детище IBM и Sony их всего девять, то в экспериментальном кристалле Intel — добрых восемьдесят (матрица 8x10). И там и там ядра максимально упрощены и функционируют на частоте 3—4 ГГц; и там и там, чтобы снять проблему недостаточной пропускной способности, каждому ядру выделяется кусочек локальной памяти, с которым оно может работать без оглядки на всех остальных; и там и там используется сложнейшая система связи, связывающая отдельные ядра в многомерную сетку, в которой передаются данные. Разница только в реализации: если IBM и Sony используют сравнительно традиционные технологии, то Intel — принципиально новые. Например, в Cell локальная память реализована как упрощенный аналог кэш-памяти первого уровня и является частью кристалла процессора. В терапроцессоре же используется технология трехмерной упаковки оперативной памяти — на подложке строится «сэндвич» из кристаллов оперативной памяти и лежащего над ними кристалла процессора, что позволяет разместить на той же площади куда больше и ядер, и подключенной к ним памяти. В ядрах Cell нет кэш-памяти и тем более — когерентной (хранящей общие для всех ядер данные), в терапроцессоре — есть. В качестве внешнего интерфейса для Cell используется «электронная» технология, для терапроцессора планируется оптический канал на порядок большей пропускной способности и т. д.

Впрочем, хватает и уникальных наработок — например, в терапроцессоре планируется использовать так называемую транзакционную оперативную память, позволяющую объединить несколько операций чтения-записи в одну транзакцию, для которой гарантируется защита от одновременного чтения-записи со стороны других ядер. Например, если у нас есть счетчик — ячейка памяти, к которой обращаются все ядра, каждый раз увеличивая его на единичку, то в «классическом» варианте, когда контроллер памяти просто обслуживает запросы на чтение и на запись от всех ядер, легко может возникнуть следующая ситуация: скажем, первое ядро прочитало текущее значение счетчика, но не успело записать новое, тогда как счетчик — с уже устаревшим значением — читает второе ядро. Если, например, в счетчике было записано число 11, то и первое, и второе ядро в этом случае прочитают «11», вычислят 11+1 = 12 и два раза подряд (сперва одно, потом второе) запишут в счетчик это значение вместо правильного — 11+1+1 = 13. Когда же чтение и запись представляют собой одну транзакцию, такой проблемы не возникает — пока первое ядро не запишет в счетчик 12, второе не сможет прочитать его значения. Механизм еще требует доработки и уточнения, но уже понятно, что этот способ намного быстрее, чем сегодняшняя практика «защиты» счетчика, сводящаяся к тому, что, прочитав счетчик, процессорное ядро ставит «блокировку», запрещающую остальным процессорам что-либо читать или писать из памяти, пока туда не будет записан результат вычислений.