Эра многоядерных энергоэффективных процессоров

Сергей Пахомов

Производительность процессора

Негативные последствия увеличения тактовой частоты

Энергетическая эффективность процессора

Преимущества многоядерной архитектуры

Процессорная микроархитектура Intel Core

Выводы

 

Летом этого года в продаже появились двухъядерные процессоры нового поколения для настольных ПК семейства Intel Core 2 Duo, основанные на новой процессорной микроархитектуре Intel Core. О таких процессорах мы уже неоднократно писали, но главным образом речь шла об их беспрецедентно высокой производительности. При этом сравнивалась производительность новых процессоров и процессоров Intel предыдущих поколений, а также процессоров AMD. В этой статье мы постараемся детально рассмотреть особенности новых процессоров и их основные преимущества для пользователей с точки зрения не только производительности, но и энергоэффективности, а кроме того, обсудим причины перехода к многоядерной архитектуре процессоров.

В ноябре уходящего года компания Intel анонсировала свой первый четырехъядерный процессор серии Extreme Edition, а по телевидению, хоть и со значительным опозданием, прошла реклама двухъядерных процессоров семейства Intel Core 2 Duo. И четырехъядерный процессор Intel Core 2 Quad, и двухъядерные процессоры семейства Intel Core 2 Duo объединяет то обстоятельство, что в основе исполнительных ядер лежит одна и та же микроархитектура Intel Core. Причем, как утверждает телереклама, процессоры на базе новой микроархитектуры и производительнее и экономичнее всего того, что было создано до сих пор. Иными словами, процессор, опередивший время, и никак иначе. К любой рекламе нужно относиться более чем настороженно. Во всяком случае, доверять рекламным заявлениям о беспрецедентной производительности, ценах ниже рыночных и прочей ерунде не стоит. Но вот с рекламой Intel, как это ни странно, все абсолютно корректно и соответствует действительности. Новые процессоры на самом деле более производительные, потребляют меньше электроэнергии в сравнении и с процессорами Intel предыдущего поколения, и с любыми процессорами AMD (речь, естественно, идет о сопоставлении процессоров одного ценового сегмента). Конечно, ждать от рекламы, направленной на среднестатистического пользователя, какой-либо детальной информации не приходится. Все очень лаконично и просто: производительнее и экономичнее. Ни тебе конкретных цифр, ни ответа на вопрос «почему?». Впрочем, что еще можно ждать от краткой рекламы? Ведь ее цель — привлечь внимание пользователей к новому продукту, и не более того. В нашей статье мы и займемся рассмотрением подробностей и попробуем ответить на главный вопрос — почему.

Однако, прежде чем перейти к обсуждению основных особенностей новых процессоров (а точнее, новой процессорной микроархитектуры), нам предстоит детально ознакомиться с такими важнейшими понятиями, как производительность и энергетическая эффективность процессоров. Конечно, современный процессор имеет достаточно большое количество различных технических характеристик. Это и технологический процесс производства, и напряжение питания, и размеры кэша, и тактовая частота, и многое другое. Ну а если опуститься на уровень микроархитектуры ядра процессора, то придется столкнуться с такими терминами, как длина конвейера процессора, регистры процессора, исполнительные блоки и многое другое. Разобраться со всеми этими терминами неподготовленному пользователю довольно сложно, да и не всегда нужно. В конечном счете с потребительской точки зрения у процессора существует только две характеристики: производительность и энергоэффективность. Все остальные технические показатели можно считать вторичными, поскольку они в совокупности оказывают влияние именно на производительность и потребляемую процессором мощность. Итак, рассмотрим более подробно, что такое производительность и энергетическая эффективность процессора.

Производительность процессора

На уровне интуиции с понятием производительности процессора проблем не возникает. Чем быстрее процессор выполняет программу, тем он более производителен. В качестве примера можно рассмотреть процесс конвертирования аудиофайла в формат MP3. Из двух процессоров более производительным мы считаем тот, который быстрее выполняет конвертирование. Другой пример — финальный рендеринг сцены, созданной в какой-либо программе по трехмерному моделированию (например, 3ds max или Maya). Чем быстрее процессор справится с задачей рендеринга, тем он более производителен. Таких примеров можно привести достаточно много, но и без того понятно, что производительность процессора связана со скоростью выполнения им программного кода. Собственно, именно таким образом и трактуется производительность процессора (Performance), под которой понимают скорость выполнение им инструкций программного кода (Instruction Per Second, IPS) или количество инструкций, выполняемых в единицу времени (за одну секунду). Если попытаться записать данное определение в виде математической формулы, то получится следующее:

 

Как известно, процессор работает на определенной тактовой частоте, которая является одной из его важнейших технических характеристик. За каждый такт, то есть промежуток времени, обратный тактовой частоте, процессор выполняет определенное количество инструкций. Поэтому вместо количества инструкций программного кода, выполняемых за единицу времени, удобнее рассматривать количество инструкций программного кода, выполняемых за один такт процессора (Instruction Per Clock, IPC). IPC зависит и от микроархитектуры процессора, и от технологии производства, определяющей минимальные размеры используемых транзисторов и их быстродействие, и от оптимизации программного кода к архитектуре процессора.

Переписав выражение для производительности процессора в виде произведения количества инструкций, выполняемых за один такт процессора, на количество тактов процессора за единицу времени (тактовая частота процессора, F), получим:

 

Как видим, производительность процессора прямо пропорциональна как тактовой частоте, так и количеству инструкций, выполняемых за один такт. Из этой формулы также следует, что существует два принципиально разных подхода к увеличению производительности процессора. Первый из них заключается в увеличении тактовой частоты, а второй — в увеличении IPC.

На практике, как правило, реализуются оба подхода одновременно, то есть производительность процессора увеличивается за счет как масштабирования тактовой частоты, так и увеличения IPC. Вопрос лишь в том, какой из двух подходов является доминирующим. Кроме того, забегая вперед, отметим, что IPC и максимально возможная тактовая частота процессора взаимосвязаны.

Из истории развития десктопных процессоров Intel понятно, что до недавнего времени доминирующим средством увеличения производительности процессора являлось масштабирование тактовой частоты. Производительность процессоров буквально отождествлялась с их тактовой частотой, а микроархитектура создавалась именно с расчетом обеспечения ее максимально возможного масштабирования. Примером этого может служить микроархитектура Intel NetBurst, положенная в основу процессоров семейства Pentium 4, особенностью которой является супердлинный конвейер, что позволяет наращивать тактовую частоту. Дабы не рассматривать микроархитектуру Intel NetBurst детально, поясним это на ассоциативном примере. Предположим, что необходимо собрать несколько ПК, что может выполнить один человек, затратив определенное время. Однако эту же работу можно поручить нескольким людям, организовав их труд по схеме конвейера, когда каждый из них выполняет определенную операцию на конвейере, а собираемые системные блоки движутся по ленте транспортера от одного сборщика к другому. Понятно, что чем больше человек занято на конвейере (число ступеней конвейера), тем меньший объем работы выполняет каждый из них, а следовательно, тем быстрее сможет двигаться конвейер.

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

Даже в простейшем процессоре можно выделить четыре ступени конвейера обработки данных и команд. Прежде всего инструкции и данные забираются из кэша (так называется быстродействующая память процессора), разделенного на кэш данных и кэш команд. После этого выбранные из кэша инструкции декодируются в понятные для процессора машинные команды. Данная процедура называется декодированием. Далее декодированные инструкции поступают на исполнительные блоки процессора, выполняются, а результат записывается в кэш процессора. Таким образом, даже в самом простейшем случае команда проходит как минимум четыре стадии обработки, которые принято называть конвейером обработки команд. В данном случае конвейер является четырехступенчатым. Важно, что каждую из этих ступеней конвейера команда должна проходить ровно за один такт работы процессора. Соответственно для четырехступенчатого конвейера для обработки одной команды отводится ровно четыре такта.

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

Если вспомнить наш ассоциативный пример с конвейерной сборкой ПК, становится понятно, что чем больше ступеней у конвейера, тем меньше работы выполняется на каждой ступени и, следовательно, тем меньше времени требуется для прохождения командой данной ступени. А поскольку каждая ступень выполняется за один такт, длинные конвейеры позволяют повышать тактовую частоту процессора, что невозможно в случае коротких конвейеров. Из этого следует, что длина конвейера тесно связана с максимальной тактовой частотой, на которой может работать процессор. В то же время длина конвейера является одним из параметров, определяющих IPC, — чем больше ступеней в конвейере (при прочих равных условиях), тем меньше инструкций выполняется процессором на каждом такте. Таким образом, мы приходим к еще одному важному выводу: длина конвейера связана и с тактовой частотой процессора, и с IPC, следовательно, максимальная тактовая частота связана с IPC, причем чем выше IPC, тем ниже максимально возможная тактовая частота и наоборот.

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

Негативные последствия увеличения тактовой частоты

Как мы уже отмечали, микроархитектура Intel NetBurst, положенная в основу процессоров семейства Pentium 4, изначально разрабатывалась под возможность наращивания тактовой частоты. Первоначально (в процессорах на ядре с кодовым названием Northwood) длина конвейера составляла 20 ступеней, а впоследствии (в процессорах на ядре с кодовым названием Prescott) она была увеличена до 31 ступени. В результате за пять лет существования процессоров семейства Pentium 4 их тактовая частота была увеличена более чем в три раза. Стартовав с отметки чуть больше 1 ГГц, за пять лет она достигла 3,8 ГГц.

Казалось бы, если масштабирование тактовой частоты представляет собой довольно эффективное средство для увеличения производительности процессоров, что мешает и дальше двигаться в этом же направлении? Почему можно утверждать, что наращивание тактовой частоты процессоров как доминирующий способ увеличения производительности — это тупик?

Дело в том, что увеличение тактовой частоты процессора приводит к росту его энергопотребления и, как следствие, к повышению тепловыделения.

Зависимость потребляемой процессором мощности от его тактовой частоты можно представить следующей формулой:

 

Power = CU2F.

 

То есть мощность, потребляемая процессором, прямо пропорциональна тактовой частоте (F), квадрату напряжения питания процессора (U2) и его так называемой динамической емкости (C). Учитывая, что сама тактовая частота обусловлена напряжением питания процессора, потребляемая мощность нелинейным образом зависит от частоты процессора. Соответственно получаем нелинейную связь между производительностью процессора и потребляемой им мощностью.

Эмпирическим путем установлено, что при увеличении (разгоне) тактовой частоты на 20% производительность процессора возрастает на 13%. Дело в том, что, несмотря на теоретическую прямолинейную зависимость между производительностью процессора и его тактовой частотой, в реальности она не является строго пропорциональной. При этом потребляемая процессором мощность возрастает на 73%! При уменьшении тактовой частоты процессора на 20% производительность уменьшается на 13%, а потребляемая мощность — на 49%! Этот пример наглядно демонстрирует, что увеличение тактовой частоты приводит к явному дисбалансу между приростом производительности и потребляемой мощностью.

В погоне за производительностью, которая, как уже отмечалось, в семействе Intel Pentium 4 обеспечивалась главным образом увеличением тактовой частоты, последние версии процессоров на архитектуре NetBurst достигли уровня энергопотребления в 130 Вт. Казалось бы, ничего страшного — ведь это соответствует одной-двум лампам накаливания и любая люстра в квартире потребляет больше электроэнергии. Однако проблема заключается в том, что эта мощность выделяется процессором в виде тепла, что приводит к его нагреванию. И если для лампы накаливания такой нагрев не критичен, то для процессора все не так просто. Процессоры настольных ПК могут сохранять нормальную работоспособность вплоть до температуры 70 °С, а это означает, что при столь высоком энергопотреблении необходимо обеспечить эффективный отвод тепла, для чего используются процессорные кулеры. Проблема, однако, заключается в том, что современные воздушные процессорные кулеры обеспечивают эффективное охлаждение процессоров при энергопотреблении только до 100 Вт — лишь немногие мощные устройства позволяют охлаждать процессоры с более высоким энергопотреблением, причем эти кулеры довольно шумные.

С учетом того, что энергопотребление десктопных процессоров семейства Intel Pentium 4 уже достигло своего критического значения, дальнейший рост их производительности просто невозможен в рамках существующей архитектуры. Можно говорить, что архитектура NetBurst полностью исчерпала свои потенциальные возможности и создала своего рода тупиковую ситуацию в дальнейшем развитии процессоров.

Интересно отметить, что нелинейная зависимость между потребляемой мощностью и производительностью процессора была впервые подмечена Фредом Поллаком (Fred Pollack) в 1999 году, еще до внедрения архитектуры NetBurst. Остается лишь спросить у компании Intel — если все с самого начала было известно, то зачем вообще понадобилось разрабатывать архитектуру NetBurst, у которой не было будущего? Скорее всего, ответ на этот вопрос достаточно прост: восемь лет назад, когда проблема энергопотребления процессоров не стояла столь остро, проще было убедить всех в том, что будущее за тактовой частотой, а не заниматься разработкой новой архитектуры. Помните маркетинговые заявления, что недалек тот день, когда тактовая частота процессоров будет измеряться десятками гигагерц? Мечты остались метами, а то, что должно было случиться, случилось. Сейчас о тактовой частоте процессоров как о средстве увеличения производительности уже не говорят.

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

Энергетическая эффективность процессора

Если абсолютную производительность процессора принято измерять в количестве программных инструкций, выполняемых в единицу времени (Instruction Per Second, IPS), то энергетическую эффективность процессоров можно характеризовать величиной, численно равной среднему количеству поглощенной энергии, приходящейся на одну выполненную инструкцию (Energy Per Instruction, EPI). EPI измеряется в джоулях (Дж) и определяется по следующей формуле:

 

EPI нетрудно связать и с другой часто используемой характеристикой энергетической эффективности процессора, иногда называемой оптимизированной производительностью процессора и определяемой как производительность процессора в расчете на каждый ватт потребляемой мощности (Performance Per Watt):

 

Соответственно:

 

EPI = Power / Performance.

 

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

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

Энергетическая эффективность процессоров зависит от таких факторов, как дизайн процессора, технологический процесс производства и напряжение питания.

Возвращаясь к семейству процессоров Intel Pentium 4, отметим, что их дизайн был изначально ориентирован на достижение максимальной производительности любыми путями. Речь идет о высокой динамической емкости десктопных процессоров, за счет чего они потребляют достаточно много энергии для обработки каждой инструкции. Длинный конвейер, сложная структура блока внеочередного исполнения команд, спекулятивный характер обработки команд и многое другое — все это в конечном счете ведет к повышению значении EPI. Итак, к особенностям микроархитектуры Intel NetBurst можно отнести не только возможность увеличения производительности за счет масштабирования тактовой частоты, но и высокое значение EPI.

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

Преимущества многоядерной архитектуры

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

В реальности, конечно, все несколько сложнее — результат будет зависеть от используемого приложения и его оптимизации к двухъядерному процессору. То есть, чтобы приложение могло одновременно задействовать несколько процессорных ядер, оно должно хорошо распараллеливаться. Если же программный год написан таким образом, что подразумевает только последовательное выполнение инструкций, от многоядерности проку не будет.

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

Имеется многоядерный процессор с количеством ядер равным n. Предположим, что на этом процессоре выполняется программа, включающая N инструкций программного кода, причем S инструкций этого кода может выполняться только последовательно друг за другом, а P (равное N – S) инструкций являются программно независимыми друг от друга и могут выполняться одновременно на всех ядрах процессора. Обозначим через (равное S / N) — долю инструкций, выполняемых последовательно, а через (равное 1 – s) — долю инструкций, выполняемых параллельно.

 

Выполнение программного кода на одноядерном процессоре

Рис. 1. Выполнение программного кода
на одноядерном процессоре

В случае применения одноядерного процессора (рис. 1) время, затрачиваемое на выполнение всего программного кода, составит:

 

t1 = N / IPS.

 

В случае использования n-ядерного процессора (рис. 2) время, затрачиваемое на выполнение всего программного кода, окажется меньше за счет параллельного выполнения P команд на n ядрах процессора и составит:

 

Поскольку приростом производительности в данном случае можно считать сокращение времени выполнения программы при использовании многоядерного процессора по сравнению со временем выполнения той же программы при применении одноядерного процессора, то есть t1 / tn, получим, что прирост производительности составит:

 

Графическая зависимость прироста производительности от числа ядер процессора показана на рис. 3.

 

Выполнение программного кода на многоядерном процессоре

Рис. 2. Выполнение программного кода на многоядерном процессоре

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

 

Зависимость прироста производительности от числа ядер процессора

Рис. 3. Зависимость прироста производительности от числа ядер процессора

Рассмотренный нами пример представляет собой идеальную ситуацию, но в реальности все несколько сложнее, тем не менее основная идея остается неизменной: использование многоядерных процессоров требует внесения кардинальных изменений в программное обеспечение. Нужно отметить, что далеко не все приложения сегодня оптимизированы под многоядерную архитектуру процессоров. К примеру, многие игры пока еще не могут получать ощутимого прироста от многоядерной архитектуры. В то же время имеется ряд приложений, которые, наоборот, позволяют получить ощутимый прирост производительности от многоядерности. К ним относятся программы финального рендеринга трехмерных сцен, программы для работы с видеомонтажем и обработки звука и многие другие. Отметим, что все новые версии популярных программ оптимизируются под многоядерную архитектуру процессоров, поскольку за ними будущее.

До сих пор, обсуждая прирост производительности, который можно получить при переходе от одноядерной к многоядерной архитектуре, мы рассматривали только одно приложение. Тем не менее многоядерные процессоры позволяют ощутить существенный прирост производительности при одновременной работе нескольких приложений. В идеальном случае каждое приложение может исполняться на отдельном ядре процессора независимо от других приложений. К примеру, можно параллельно конвертировать видеофайлы, играть в игры и т.п.

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

Конечно, многоядерная архитектура — это лишь один из рецептов создания высокопроизводительных энергоэффективных процессоров. Для создания действительно энергоэффективного многоядерного процессора необходимо, чтобы каждое его ядро было оптимизировано для многоядерной архитектуры и к тому же было энергоэффективным. К примеру, двухъядерные процессоры Intel, основанные на архитектуре NetBurst (семейство Intel Pentium D), позволяют лишь частично решить проблему повышения энергоэффективности. Дело в том, что микроархитектура каждого ядра процессора семейства Intel Pentium D оптимизирована под масштабирование тактовой частоты и не является энергоэффективной.

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

Процессорная микроархитектура Intel Core

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

Прежде всего, Intel Core изначально разрабатывалась как архитектура энергоэффективного процессора, в котором рост производительности достигается за счет увеличения числа исполняемых инструкций за такт (IPC). Эффективная длина конвейера в микроархитектруе Intel Core составляет 14 ступеней. Для сравнения отметим, что у процессора Pentium 4 она варьируется от 20 до 30 ступеней (в зависимости от модели). Как видно, новый процессор относится к классу короткоконвейерных. Конечно, увеличение IPC достигается не только за счет короткого конвейера. В Intel Core используется множество инновационных технологий, которые позволяют снизить энергопотребление процессора и существенно увеличить его производительность в сравнении с Intel NetBurst. В результате процессоры семейства Intel Core 2 Duo демонстрируют более высокую производительность, чем процессоры семейства Intel Pentium 4, и при этом потребляют существенно меньше электроэнергии (всего 65 Вт), то есть являются более энергоэффективными.

Другое преимущество процессорной микроархитектуры Intel Core над микроархитектурой Intel NetBurst заключается в том, что она изначально оптимизирована под двухъядерную архитектуру процессора. И хотя это и не мешает компании Intel выпускать и четырехъядерные процессоры с ядрами на основе микроархитектуры Intel Core, все же родным для данной архитектуры является именно двухъядерный процессор семейства Intel Core 2 Duo.

Выводы

Если говорить о дне сегодняшнем, то единственным процессором для настольных ПК, который сочетает в себе одновременно высокую производительность и низкое энергопотребление, является процессор семейства Intel Core 2 Duo. Для конечных пользователей это означает возможность создания высокопроизводительных и в то же время малошумных домашних ПК, которые могут с успехом использоваться как рабочие станции, игровые ПК и мультимедийные центры. А потому выбор процессора для домашнего ПК может быть только один — Intel Core 2 Duo.

 

В начало В начало

КомпьютерПресс 12'2006


Наш канал на Youtube

1999 1 2 3 4 5 6 7 8 9 10 11 12
2000 1 2 3 4 5 6 7 8 9 10 11 12
2001 1 2 3 4 5 6 7 8 9 10 11 12
2002 1 2 3 4 5 6 7 8 9 10 11 12
2003 1 2 3 4 5 6 7 8 9 10 11 12
2004 1 2 3 4 5 6 7 8 9 10 11 12
2005 1 2 3 4 5 6 7 8 9 10 11 12
2006 1 2 3 4 5 6 7 8 9 10 11 12
2007 1 2 3 4 5 6 7 8 9 10 11 12
2008 1 2 3 4 5 6 7 8 9 10 11 12
2009 1 2 3 4 5 6 7 8 9 10 11 12
2010 1 2 3 4 5 6 7 8 9 10 11 12
2011 1 2 3 4 5 6 7 8 9 10 11 12
2012 1 2 3 4 5 6 7 8 9 10 11 12
2013 1 2 3 4 5 6 7 8 9 10 11 12
Популярные статьи
КомпьютерПресс использует