Пятница, 29.03.2024, 10:10
Приветствую Вас Гость | Регистрация | Вход

Ремонт компьютера за час на дому и офисе

Каталог статей

Главная » Статьи » Статьи

Архитектура Conroe от компании Intel

Это самая интересная новинка на процессорном (да, пожалуй, и не только на процессорном) рынке за долгие годы. С трудом припоминаю те времена, когда новые процессоры в большинстве приложений показывали производительность в полтора раза выше, чем старые, при отсутствии явных недостатков, с точки зрения потребителя, как-то: ужасающего тепловыделения, малой доступности, жуткой цены. По-настоящему впечатляющих новинок, равно как и гонки производительности, процессорный рынок не знал давно (года три), и в прошлом году на презентациях двуядерных процессоров представители Intel и AMD в один голос твердили, что возможности по наращиванию мощи отдельно взятого процессорного ядра практически исчерпаны. Полгода назад рассказы о чём-то подобном казались столь же правдивыми, как предположения о том, что на чемпионате мира по футболу сборная России всухую разгромит национальные команды Бразилии, Германии, Франции, Португалии и всех, кто ей по пути подвернётся.



Однако, видимо, у российских футболистов не было таких денег и такой воли к победе, как у американской корпорации, поскольку они не дошли даже до групповых матчей, а Intel сделала прорыв, сотворив — да-да — настоящее инженерное чудо. Причём, хотя полупроводниковый гигант последние несколько лет ужесточает политику в части разглашения подробностей о своих CPU и официальных сведений о Conroe до смешного мало, большинство экспертов сходятся на том, что для того, чтобы совершить подлинную революцию в увеличении производительности на такт частоты, оказалось достаточно «укрупнить» отдельные части процессора предыдущего поколения — Core Yonah, который, в свою очередь, был развитием Pentium M Dothan, который являлся улучшенным Pentium M Banias, который стал следующим шагом после Pentium III Coppermine и Tualatin, который вырос из Pentium II, обязанного своим появлением Pentium Pro образца 1995 года…

Сама Intel утверждает: «Core 2 — это объединение лучших архитектурных решений Pentium 4 и Pentium M», но на самом деле единственное, что Conroe унаследовал от Pentium 4, — это системная шина. Образно говоря, Conroe — это «Жигули» пятой модели, на которые поставили двигатель чудовищного объёма и мощности, турбину, необходимые для их функционирования детали и колеса от болида «Формулы-1». Сам по себе подобный путь, безусловно, имеет право на существование (хотя сравнение усовершенствованных «Жигулей» с гоночной спортивной машиной, конечно, перебор), но, по идее, расплатой за это должны были стать «утяжеление» (снижение предельно достижимых тактовых частот) и «высокий расход горючего» (чрезвычайно высокое тепловыделение CPU). Но на практике всё оказалось гораздо лучше, чем можно было ожидать (и, похоже, даже лучше, чем предполагали в Intel), и благодарить за это нужно, очевидно, технологов Intel, которые воплотили архитектуру Conroe в кристаллах.

То, что инженеры корпорации не зря едят свой хлеб, в общем-то, было понятно давно: достаточно проследить, как убийственный по тепловым характеристикам Prescott они шаг за шагом, степпинг за степпингом ухитрились вписать в разумные рамки и за пару лет добились того, что двуядерные и существенно более сложные процессоры Presler по тепловыделению вплотную приблизились к наименее горячему некогда камню — Athlon 64 X2. Но, проектируя Conroe, похоже, они превзошли самих себя, поскольку тепловые характеристики чипа в итоге оказались лучше, чем у процессоров AMD, а диапазон тактовых частот — шире. Пусть самые нетерпеливые заглянут в конец статьи. Расскажу, что же было изменено в архитектуре Pentium III / M и почему я сравнил Core 2 с турбированными «Жигулями».

New Generation Micro-Architecture

Когда Intel только завоёвывала себе место под солнцем, архитектура P6, дебютировавшая в 1996 году, была чрезвычайно прогрессивной и фантастически сложной для своего времени. Позднее, в эпоху Pentium 4, в сознании массового пользователя закрепился стереотип: «Чем длиннее конвейер, тем меньше производительность на мегагерц», но тогда ещё народ ни о чём подобном не задумывался, а потому увеличение длины конвейера с 5 до 12—14 стадий, равно как и то, что в результате производительность на мегагерц повысилась (!) на 20-30%, никого не смущало. Конечно, увеличение длины конвейера было ни при чём: оно, как и повышение производительности, явилось следствием перехода на несравненно более прогрессивную архитектуру. Прогрессивность имела и обратную сторону: сложность Pentium Pro была для тех лет убийственной, процент годных процессоров — крайне скромным, а цены — «профессиональными», то есть очень высокими.

Впрочем, трудности оказались преодолимыми: по мере совершенствования заводов Intel проблема изготовления сложных кристаллов сходила на нет. Однако сделать ещё один большой шаг вперёд для Intel было затруднительно, да и, по правде, совершенно не нужно: достойных конкурентов Pentium Pro не предвиделось. Именно в ту пору прогорели многие производители x86-процессоров, оказавшиеся ни к чему подобному не готовыми. Intel же оставалось только потихоньку оттачивать архитектуру — доводить её до идеального состояния. В итоге P6 получила поддержку MMX (Pentium II), SSE (Pentium III), кэш-память второго уровня вначале переместили с отдельного кристалла, составлявшего единую микросборку с процессором, на специальную плату (кто-нибудь ещё помнит такие картриджи?), а потом и вовсе сделали частью основного кристалла.

Но саму архитектуру не изменяли — она и так была слишком хороша. Не исключено, что мы бы так до сих пор на ней и работали, если бы в определённый момент изрядно «похудевшая» компания AMD, отсудившая в своё время у Intel примерно миллиард долларов за нарушение условий лицензионного соглашения, истратившая этот миллиард и потихоньку распродавшая многие свои подразделения (и перебивавшаяся продажей флэш-памяти), не подготовила достойного и современного конкурента P6 — Athlon на архитектуре K7. Ну а что было дальше, знают все: гонка мегагерцев, «чересчур прогрессивный» Pentium 4, ответ AMD в виде 64-битной K8, тепловой предел гонки тактовых частот — и стагнация рынка процессоров, переход к более простым, экстенсивным способам развития, таким как реализация многоядерности. Архитектура P6 тем временем продолжала совершенствоваться как мобильная.


Архитектура Pentium Pro

А дальше… а дальше стало очевидно, что Pentium 4 — это тупиковая ветвь эволюции, и разработка очередного процессора данной серии (он должен был удивить нас конвейером с эффективной длиной более 50 стадий) была остановлена. Его требовалось чем-то заменить — и на сцену вышли представители славного Израиля, которые занимались развитием P6, и предложили реанимировать давно отправленного на пенсию «старичка». Чтобы вы поняли, что именно было сделано, попробую на пальцах объяснить главную идею устройства P6.

1. P6 — представительница так называемой классической гарвардской архитектуры, то есть в ней присутствуют две области быстродействующей памяти (кэши первого уровня): кэш инструкций (L1 Instructions, или I-cache) и кэш данных (L1 Data, или D-cache). В первом хранится выполняемая программа, во втором — данные, ею используемые. Запуск программы или взятие данных из каких-либо других мест невозможны: если мы хотим что-то посчитать, сперва мы должны это что-то скопировать в соответствующий кэш первого уровня. Так что выполнение любой программы начинается с того, что соответствующие ей инструкции попадают в I-cache.

2. Из I-cache инструкции, до которых дошёл процессор, изымаются специальным блоком — Instruction Fetch Unit (блок выборки инструкций). Его задача — выбрать некий достаточно большой кусок памяти (байт эдак на шестнадцать-двадцать) из кэша, что, в общем-то, даже не заслуживало бы отдельного упоминания, если бы этому блоку не приходилось отслеживать ход выполнения программы с учётом условных и безусловных переходов. В случае безусловного перехода блок просто переключается на новое место в кэше, при необходимости подгружая в
I-cache новые части программы из оперативной памяти, а вот в случае условного перехода, пользуясь специальным блоком предсказания переходов (Branch Prediction Unit, BPU), как бы начинает гадать на кофейной гуще — определяет, по какому пути пойдёт дальше программа. Точность предсказания подобного перехода — свыше 95-98%, поэтому Fetch Unit обычно не ошибается в том, какие инструкции ему посылать далее на конвейер.

3. Взятый блоком выборки кусок памяти дробится на отдельные x86-инструкции, которые ставятся в специальную очередь — x86 Instruction Fetch Buffer. Но поскольку инструкции x86 являются разработкой 80-х — начала 90-х, причём разработкой, прямо скажем, рассчитанной на микропроцессор (именно микро-, не иначе) тех лет, а не на монстра XXI века, то CPU архитектуры P6 по мере возможности направляет их в специальные декодеры (Instruction Decoders). Декодеры переводят инструкции x86 в более простой и удобный для процессора вид — микроинструкции (mOP). Элементарными инструкциями, которые удаётся конвертировать в 1 mOP, занимаются простые декодеры, остальными — сложный декодер, заменяющий x86-инструкции последовательностями из нескольких mOP, а то и целыми подпрограммами (он их заимствует из специальной области памяти — микрокода процессора).

4. Полученные из x86-кода микроинструкции проходят ещё одну коротенькую очередь, призванную сгладить неравномерность декодирования инструкций (то семь mOP за такт, то две штучки), и попадают в специальный блок. Это своеобразный «завхоз» по процессору: условно, в нём mOP выдаётся разрешение на пользование теми или иными ресурсами процессора. В частности, определяется, из какого внутреннего регистра инструкция должна брать необходимые ей данные и куда их сохранять. К «реальным» регистрам, указанным в x86-инструкции программистом, это не имеет отношения: потом процессор учтёт такие мелочи. Получив необходимые допуски, микроинструкции попадают в блок внеочередного выполнения (ReOrder Buffer, ROB).

5. Вопреки названию, ROB на самом деле ничего не переупорядочивает и вне очереди никого никуда не пропускает. По сути, ROB — аналог стойки регистрации в аэропорту, на которой должен отметиться каждый пассажир, прибывший в зал ожидания перед вылетом. Это просто большая таблица, и в ней записано, какие инструкции сейчас выполняются процессором, какие у них исходные данные и какие числа получаются в результате. По мере выполнения инструкций соответствующие записи в таблице обновляются. Когда результат становится известен, ROB «публикует» его, соответственно изменяя видимые пользовательской программе регистры процессора или разрешая записать вычисленное число в оперативную память, после чего стирает информацию о инструкции из своей таблицы. Существование данного блока объясняется главным образом необходимостью «публикации» результатов строго в той последовательности, в какой соответствующие инструкции приводились в исходной программе. Это нужно для того, чтобы в случае возникновения какой-либо ошибки (допустим, ошибки предсказания условного перехода) неверные результаты не вышли за пределы конвейера процессора.

6. Сделав отметку в ROB, микроинструкция без задержек попадает в самое сердце процессора архитектуры P6 — так называемую Reservation Station, «зал ожидания». Это последний этап перед выполнением инструкции, с вычислением результатов: микроинструкции стоят в очередях, ожидая, пока не дойдут все необходимые им данные (пока не завершится операция чтения из оперативной памяти или не будет вычислена предыдущая инструкция) и не освободится подходящее им исполнительное устройство процессора. Причём порядок, в котором они поступили в Reservation Station, не играет никакой роли: если какая-то микроинструкция застряла в ожидании данных, Reservation Station может пропустить вперёд следующие за ней инструкции (буде их данные готовы). Помимо возможности внеочередного выполнения кода, позволяющей во время непредвиденного простоя занять процессор каким-либо другим делом, Reservation Station помогает решить и другую задачу: благодаря тому, что к ней подключено сразу несколько функциональных устройств, на выполнение могут быть запущены пять-шесть (!) микроинструкций одновременно.

7. Остаётся только добавить, что, отстояв очередь в Reservation Station, микроинструкция отправляется вместе с готовыми данными на выполнение в одно из соответствующих функциональных устройств. Забавно, но это один из самых коротких этапов конвейера: обычно он занимает один такт (на выполнение инструкции требуется свыше 14 тактов!), в сложнейших случаях — четыре-семь тактов, не больше. Полученный результат вычислений возвращается в ROB, где благополучно дожидается либо своей очереди на выписку, либо возникновения ошибки в ходе вычисления очередной микроинструкции, а такой сбой приводит к остановке и, как правило, сбросу конвейера со всеми ранее посчитанными результатами.

Сложновато? Ничего страшного, потому что дальше пойдёт непосредственное сравнение характеристик — понятные и наглядные циферки. Так что констатируем: приведённому описанию удовлетворяют и Pentium Pro, и Pentium III, и Conroe. Продолжаем.


Архитектура Pentium M

1. Первое, что приходит в голову при сравнении Pentium M и Conroe, — это пересчитать количество функциональных блоков, выполняющих те команды, из которых состоит программа, загружаемая нами в процессор. У Pentium III и Pentium M таких блоков девять, у Conroe — одиннадцать. Разница на первый взгляд невелика, но надо учитывать, что одновременно работать каждый такт все блоки не могут: они определённым образом сгруппированы в так называемые порты запуска инструкций, причём три порта у любого из рассматриваемых процессоров целиком и полностью заняты выполнением разнообразных операций, связанных с оперативной памятью, а не собственно вычислениями. Сделав соответствующую поправку, мы получаем несколько иные цифры: у Pentium Pro и Pentium M по два порта запуска, у Conroe — три, то есть потенциально чистая производительность в обычных целочисленных вычислениях и вычислениях с использованием SSE у Conroe выше в полтора раза.

2. Второе, на что следует обратить внимание, — это циферки, расставленные у исполнительных блоков. Наиболее очевидно то, что блоки целочисленных и логических вычислений (ALU) у Conroe не 32-разрядные, а 64-разрядные. Иными словами, Conroe, в отличие от Pentium M, — 64-разрядный процессор. Но, хотя за 64-разрядными вычислениями будущее, да и сам набор инструкций AMD64 / EM64T крайне интересен, к сожалению, это начинание пока не получило широкой поддержки. Для наших читателей, думаю, интереснее число 128 напротив блоков SSE и FPU. Оно означает, что операции с «упакованными» (128-битными) числами (вернее, с парами 64-разрядных или четвёрками 32-разрядных чисел) эти блоки умеют производить за один такт (раньше было два). Иными словами, пиковая производительность Conroe на оптимизированных под SSE программах в вычислениях с целыми числами должна была вырасти не в полтора, а в три раза, в вычислениях SSE с плавающей точкой — в два раза.

3. Впрочем, простого добавления исполнительных устройств для реализации действительно хорошего процессора недостаточно. Необходимо также создать инфраструктуру, чтобы эти устройства были постоянно загружены и не стояли без дела. Так, во всех процессорах P6-типа существовало по два простых декодера и один сложный, а линии связи между разными составляющими конвейера были рассчитаны на то, чтобы передавать до трёх микроинструкций за такт. В Conroe добавился третий простой декодер, а линии между участками пропускают до четырёх микроинструкций за такт. Intel анонсировала это нововведение с помпой (как 4-width issue), хотя, в принципе, интересен не сам факт декодирования и запуска этих четырёх микроинструкций, а наличие процессорных ресурсов, которые этими микроинструкциями можно загрузить.

Тем не менее замечу, что Pentium 3 / M / Core Yonah были способны выполнять в устоявшемся режиме до трёх инструкций за такт, а Conroe, соответственно, четыре. Но, главное, Conroe, как и Yonah, в отличие от их предшественников, полноценно обрабатывает инструкции SSE на простых декодерах (Pentium III и Pentium M умели делать это только на сложном). Впрочем, для них, неспособных обрабатывать больше чем одну инструкцию SSE с «упакованными» 128-битными числами, это всё равно было не то чтобы важно, а вот для Conroe, с радикально увеличенными вычислительными ресурсами именно в части SSE, вероятно, окажется весьма актуально. Вдвое расширена и шина памяти, идущая от исполнительных устройств к кэш-памяти L1 data (D-cache), так что будет откуда считать данные и будет куда их записать. Общий объём кэш-памяти второго уровня тоже увеличен — с 2 (Dothan и Yonah) до 4 Мбайт (старшие версии Conroe).

4. Далее, набор инструкций x86 устроен так, что в нём некоторые типовые операции реализуются только парой инструкций. Например, условный переход в программе обычно производится связкой cmp / jne. Conroe научился распознавать ряд подобных связок и заменять их едиными микрооперациями, что, по заявлению Intel, позволяет уменьшить количество выполняемых микроопераций на 10% и, соответственно, поднять производительность. Технология названа Macro-ops fusion, и её поддержка, несомненно, также поможет Conroe. Правда, в силу ограничений текущей реализации объединение двух x86-инструкций в одну микроинструкцию пока возможно лишь один раз на каждом такте, но тоже ведь неплохо: значит, довольно часто Conroe будет представляться возможность обработать за такт не четыре операции, а целых пять.

5. Но это ещё не все! Как в P6, так и в NetBurst (Pentium 4) блоки работы с оперативной памятью использовали достаточно «пессимистичные» алгоритмы, гарантировавшие корректность операций чтения-записи при внеочередном выполнении инструкций программы. Проще говоря, если в программе вначале идёт «Записать 1 по адресу А», а затем «Записать 2 по адресу А», то вне зависимости от того, какая из этих двух инструкций будет выполнена первой, по адресу А при соблюдении определённых, достаточно жёстких правил всё равно будет записано число 2. На практике подобные ситуации возникают сравнительно редко, поэтому в Conroe заложены гораздо более «агрессивные» алгоритмы, схожие с давно известным предсказанием условных переходов. Процессор исходит из «оптимистичного» сценария, накладывающего на него гораздо меньше ограничений и позволяющего ему эффективнее взаимодействовать с оперативной памятью, но отслеживает ход событий и в случае чего, как и при неправильно предсказанном условном переходе, сбрасывает конвейер.

6. Менее значимые особенности. Из-за возросшей сложности, в первую очередь по причине поддержки Macro-ops fusion и 64-битных программ, эффективная длина конвейера увеличилась до 14 стадий (у Pentium M — 12 стадий). Кэш-память второго уровня по-прежнему общая для двух ядер, и только для двух: у четырёхъядерных процессоров будет уже два кэша L2, по одному на каждые два ядра. Принят традиционный комплекс мер по энергосбережению: технология EIST автоматически понижает тактовую частоту на системном уровне, а везде и всюду в теле кристалла заложены силовые ключи, отключающие или переводящие в спящий режим не используемые в данный момент блоки, вплоть до отключения старших 64 бит на 128-битной шине, когда по ней не передаются 128-битные данные. Наконец, Conroe будет поддерживать набор инструкций SSE4, хотя ничего особо интересного, как и SSE3, тот с собой не принесёт.


Архитектура Conroe

Набор усовершенствований, что ни говори, впечатляющий (такого размаха не ожидал никто!), и в этом плане Conroe заметно дальше отстоит от Pentium III, чем последний — от Pentium Pro. Бесспорно, это абсолютно новый процессор, а не доработка старого, проводимая при всех предыдущих сменах поколений: Pentium Pro > II > III > M > Core. И тем не менее Conroe всё-таки гораздо ближе к Pentium Pro (P6), чем к AMD Athlon (K7 / K8) или тем более к Pentium 4 (NetBurst), поэтому мне никак не удаётся отделаться от ощущения, будто нам в шестой раз продают те же самые «Жигули», пусть даже с новым двигателем, красивой покраской и изящным антикрылом. Впрочем, прошли придирки: в конце концов, выбирая между некогда инновационным продуктом, каким был Pentium 4, и «слегка не новым» Conroe, я, пожалуй, предпочту второй.

Intel начинает. И выигрывает?

Как и обещал, в конце статьи привожу цифры, характеризующие производительность и тепловыделение инженерных образцов Conroe. Воздержусь от комментариев, всё и так понятно. Лучше расскажу о том, когда следует ждать этого счастья, по какой цене и чем собирается на это ответить нынешний лидер рынка процессоров — компания AMD. Итак…

1. Официальное название Conroe — Intel Core 2. Двуядерные версии — Core 2 Duo, одноядерные — Core 2 Solo. Поначалу корпорация анонсирует пять процессоров, от E6300 (частота — 1,83 ГГц, объём кэша — 2 Мбайт, цена — $183) и E6400 (2,13 ГГц, 2 Мбайт, $224) до E6600 (2,40 ГГц, 4 Мбайт, $316) и E6700 (2,67 ГГц, 4 Мбайт, $530). Тепловой пакет у них скромный — 65 Вт. Одновременно выйдет и экстремальный X6800 (2,93 ГГц, 4 Мбайт, $999) с несколько большим TDP — 75 Вт. Все эти процессоры рассчитаны на частоту шины 1066 МГц, чуть позже увидит свет и младший E4200 (1,6 ГГц, 2 Мбайт) для шины FSB 800 МГц. Серверные процессоры на основе аналогичного ядра Woodcrest (Xeon 5100), подобного Conroe, уже выпущены, а вот ноутбучные Core 2 Duo появятся на рынке в лучшем случае в конце этого года.

2. В Россию эти процессоры, скорее всего, завезут где-то в середине августа, вот только продавать их поначалу станут, вероятно, по завышенным ценам. Вдобавок Core 2 не согласится работать практически ни на одной из ранее выпущенных материнок. Для него потребуются новые и недешёвые системные платы на чипсетах Intel i975, P965, G965, NVIDIA nForce 570 SLI или 590 SLI. Впоследствии, скорее всего, спектр доступных вариантов расширится, хотя на продающиеся сегодня материнские платы установить Conroe всё-таки не удастся.

3. С выходом Core 2 Duo произойдёт резкий спад цен на прочие десктопные процессоры Intel: наиболее дорогой, Pentium D (960, с частотой 3,6 ГГц), возможно, подешевеет до $316, а модели ступенькой ниже (950 и 945, 3,4 ГГц) — и вовсе до $163-224. Самый скромный двуядерник Intel станет доступен, как сегодня Celeron: $93 за 2,66-гигагерцовый камень. Некоторые модели подешевеют вдвое с лишним! Так что, если планируете апгрейд, потерпите на всякий случай пару недель до выхода Conroe. Возможно, Intel преподнесёт вам приятный сюрприз.

Что до AMD, то, боюсь, радостных новостей немного. В частности, почти одновременно с Intel она тоже резко снизит цены на свою, прямо скажем, недешёвую продукцию. Например, одноядерный Athlon 64 3800+, который пока официально стоит $290, предположительно, станет продаваться по $139. Учитывая уровень производительности Pentium 4 и Pentium D в играх и не слишком широкое — на сегодняшний день — распространение оптимизации игр под многопоточность, подобных мер, видимо, будет достаточно, чтобы в нижнем ценовом сегменте продукты AMD успешно противостояли более дорогому и не очень быстрому Conroe.

По моему мнению, AMD едва ли по силам в ближайшем будущем подготовить достойного конкурента для Conroe. И проблема не в том, что K8 — это «менее совершенная» архитектура, чем Conroe. Ни в коем случае. Не сомневаюсь, что если бы на K8 навесили столь же мощную исполнительную подсистему, добавили четвёртый конвейер и сделали большой и быстрый кэш (с чем у AMD есть некоторая проблема), то K8+ (или всё-таки K10?) вполне успешно противостоял бы Conroe. Узкие места K8 хорошо известны, и серьёзных препятствий на пути к их расширению нет, с такой точки зрения K8 смотрится даже выигрышнее, чем P6, которую модернизировала Intel. Проблема в том, что по скорости разработки AMD всё больше отстаёт от своего конкурента, чей архиудачный техпроцесс 65 нм служит тому подтверждением (до конца года главный соперник корпорации Intel едва ли сумеет что-либо ему противопоставить). Поэтому остаётся надеяться на то, что с 65 нанометрами у AMD всё пройдёт гладко и это позволит нарастить тактовую частоту процессоров типа K8, чтобы сделать их в десктопном сегменте дешёвой альтернативой Conroe, на смену которой потом придёт что-то принципиально новое. Решение достаточно спорное, но поживём — увидим.

Впрочем, одно интересное решение у AMD к концу года, скорее всего, появится, и оно тоже в определённом смысле явится «утяжелённой» версией стандартного ядра K8: K8 с увеличенными вдвое блоками вычислений с плавающей точкой, более быстрым кэшем и общей для двух-четырёх процессорных ядер кэш-памятью третьего уровня. Действительно любопытно, но только это решение для рынка больших четырёх- и восьмипроцессорных серверов, на котором AMD сегодня занимает очень уверенное положение. Причём процессоры AMD будут конкурировать с Conroe не в целочисленных вычислениях, а в вычислениях с плавающей точкой, где процессоры Opteron даже сегодня не так уж и плохи.

Впрочем, делать прогнозы — занятие неблагодарное. А нас ждут очень-очень низкие цены на лучшие из доступных процессоров и возможность недорого купить чипы, за которыми будущее. Спешите пользоваться! Такое, как показывает история, бывает нечасто.

Категория: Статьи | Добавил: ipsyedinmk (14.11.2008) | Автор: Максим
Просмотров: 1898
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]