Cell-процессор. Превращение игровой консоли в суперкомпьютер.
Выпуск № 7/2006 :: Микропроцессорная техника
ЯндексДирект
Дать объявление
Системы сбора данных ioLogik
Интеллектуальные активные системы сбора данных и управления
www.moxa.ru
Микроконтроллеры от TI
Микроконтроллеры Texas Instruments для интегрированных систем!
www.ti.ru
Шунты 75ШСМ, 75ШСМ3 от 135руб.
20А,30А,50А, 75А,150А, 200А,300А,500А, 750А,1000А,1500А и другие в наличии
Адрес и телефон · www.zapadpribor.com
Системы автоматизации, управления
контроллер ввода вывода. Разработка, наладка, поставка.
www.ingservi.ru
В.Юдинцев..
Cell-процессор. Превращение игровой консоли в суперкомпьютер.
Загрузить полную версию статьи в формате .pdf (325 кб) Pdf
Разработка процессора с совершенно новой Cell-архитектурой началась в 2000 году. Компания Sony при создании игровой консоли третьего поколения PlayStation 3 поставила задачу превзойти производительность PlayStation 2 в 100 раз. Результатом стало объединение усилий разработчиков PlayStation 2 – Sony Computer Entertainment Inc. (SCEI) и Toshiba – и одного из крупнейших разработчиков компьютерной техники и ее полупроводниковой базы – компании IBM. В начале 2001 г. альянс трех фирм – Sony, Toshiba и IBM (STI) – открыл в Остине (штат Техас) Центр проектирования нового сверхпроизводительного процессора. Итог работы Центра – создание процессора с многоядерной Cell-архитектурой. Новая архитектура объединяет универсальный процессор, набор сопроцессоров, оптимизированных для векторных операций, быстродействующие интерфейс ввода/вывода и контроллер памяти фирмы Rambus. Подобно клеткам живого организма, Cell-процессоры могут устанавливать связь друг с другом и обеспечивать совместную работу самых разнообразных электронных систем (от бытовой аппаратуры до суперкомпьютеров). По мнению разработчиков, процессор откроет новую эру вычислительной техники, средств связи, развлечений и сети Интернет. При этом Сell-процессор совершенно не похож на традиционные устройства обработки данных.
Немного истории
Подход компаний STI-альянса к повышению производительности заключался в упрощении архитектуры микропроцессора и, соответственно, увеличении нагрузки на программные средства. Основной целью было сократить время обращений к памяти. Для этого потребовалось четыре года исследований, проводившихся более чем 400 специалистами альянса в 10 исследовательских центрах, разбросанных по всему миру. Были введены в строй два предприятия по выпуску микросхем с 65-нм топологическими нормами стоимостью около 1 млрд. долл. каждое. В дальнейшем на этих предприятиях будет освоен выпуск микросхем Cell-процессора. На сам проект было затрачено 400 млн. долл. Sony выделила несколько миллионов долларов компании IBM на открытие новой производственной линии на заводе в Ист-Фишкиле.
Прототип Сell-процессора, представленный на международной конференции ISSCC 2005 (International Solid-State Circuits Conference), изготовлен по 90-нм КМОП-технологии (кремний на диэлектрике) с восемью уровнями металлизации. Площадь кристалла с 235 млн. транзисторов составляет 235 мм2. По оценкам специалистов, при напряжении питания ядра 1,2 В и частоте 4 ГГц рассеиваемая мощность составит 80 Вт. Из приведенных STI графиков следует, что процессор может успешно работать на частоте 3 ГГц при напряжении питания ядра 0,9 В. Соответственно, значение рассеиваемой мощности будет еще меньше. Микросхема монтируется в 1236-контактный BGA-корпус, при этом 506 контактов – сигнальные, а остальные предназначены для питания и "заземления".
Первоначально Cell-процессор предназначался для цифровых бытовых систем, в том числе игровых платформ, телевизоров HDTV и DVD-проигрывателей высокого разрешения, а также домашних серверов. Но возможные применения нового процессора этим не ограничиваются. Фирмами IBM и Mercury Computer Systems выполнен совместный проект по созданию модульного сервера 1U Dual Cell-Based Server на базе двух Cell-процессоров*. Быстродействие смонтированного в стойке сервера составляет 410 Gflops. Предназначен он для встроенных применений в аппаратуре авиакосмического и военного назначения, а также в устройствах отображения сейсмических и медицинских данных.
Философия CELL
При создании проекта Cell, альянс STI предполагал получить процессор:
· ускоряющий работу алгоритмов игровых и медийных устройств;
· способный решать задачи общего назначения;
· эффективно поддерживающий работу с приложениями в режиме реального времени.
Основные факторы, препятствующие существенному увеличению производительности, известны: пропускная способность и задержки памяти, потребляемая процессором мощность, снижение выигрыша от увеличения тактовой частоты и длины конвейера. Рассмотрим, как они повлияли на итоговую архитектуру Cell.
Увеличение тактовой частоты процессора позволяет исполнять большее число команд при отсутствии задержек, вызванных работой с памятью. Специальная кэш-память позволяет быстрее загружать наиболее часто используемые области памяти системы. В случае отсутствия нужных данных в кэше, деятельность процессора замирает, поскольку время обращения к основной памяти занимает от нескольких сотен до тысяч тактов. Даже внедрение сравнительно больших объемов кэша (суммарно – до 1 Мбайт) не может увеличить пропускную способность памяти настолько, чтобы удовлетворить требованиям производительности Cell-процессора. Таким образом, STI нуждался в иной организации процессора, чтобы увеличить пропускную способность памяти за счет увеличения числа одновременно выполняемых групповых операций обращения к памяти.
Конвейер, также применяемый для ускорения обработки команд, разбивает их выполнение на несколько стадий, выполняемых одновременно. Однако увеличение длины конвейера (числа стадий) приводит к увеличению среднего времени выполнения команды. Это происходит в результате ошибок в прогнозировании ветвлений, остановок и очистки конвейера. Кроме того, чем больше стадий, тем больше требуется защелок (ведь между двумя стадиями конвейера необходимо поставить защелку-триггер), и обусловленная ими задержка выполнения команды увеличивается. Следовательно, нужно было разработать микро-архитектуру процессора, позволяющую минимизировать длину конвейера и сохранить при этом высокую скорость выполнения команд.
Возникла также проблема эффективности питания (GFlops/Ватт). В настоящее время КМОП-технология столкнулась с трудностями, связанными с питанием и охлаждением транзисторов. Усложнение архитектуры ЦП и увеличение числа транзисторов приводит к повышению потребляемой мощности. При четко заданных размерах корпуса, допустимых значениях скорости распространения и температуры воздушного потока решение задачи охлаждения становится крайне сложным. Это, естественно, ограничивает максимальное значение тактовой частоты. Соответственно, для получения высокой частоты процессора нужно упростить его архитектуру.
По архитектуре новый процессор существенно отличается от традиционных ПК. Несмотря на планируемое массовое использование, процессоры Cell напоминают скорее суперЭВМ, способные выполнять задачи общего назначения. Основные принципы новой архитектуры были предложены специалистами компании IBM в начале 2000 г. Они предусматривали создание суперкомпьютера на основе множества однотипных процессоров (от 10 тыс. до 1 млн.), каждый из которых имел бы собственный контроллер ОЗУ и оперативную память определенного объема. Такие процессоры должны были работать и как отдельные вычислительные единицы, и как элементы большой системы.
Предполагается, что различные устройства, выполненные на базе Cell-процессоров, можно будет объединить в комплексную систему, в которой производительность отдельных Cell-элементов повышается за счет использования компонент других устройств системы, например встроенной памяти. При этом микросхеме Cell-процессора безразлично, где находятся другие процессоры системы: в одной комнате, городе, стране или на другом континенте. Да и сами объединенные в систему устройства могут быть разными – игровая консоль, ПК, мобильный телефон и т.п.
Структура процессора
В отличие от обычного подхода к разработке высокопроизводительных устройств, призванного компенсировать влияние элементов системы с наименьшим быстродействием, при создании Cell-архитектуры ставилась задача избавиться от таких элементов. Прототип Cell-процессора представляет собой многопроцессорную микросхему, включающую (рис.1):
· 64-бит-процессорный элемент с Power-архитектурой (Power Processor Element, РРЕ);
· 8 специализированных сопроцессоров, выполненных на базе SIMD-архитектуры, и названных синергическими процессорными элементами (Synergistic Processor Elements, SPE). Архитектура SIMD (single-instruction, multiple-data) является векторной и позволяет производить команды с несколькими данными одновременно, в случае SPE одинаковые операции производятся для четырех блоков данных;
· специализированная шина (Element Interconnect Bus, EIB);
· два контроллера Rambus-интерфейсов (памяти и ввода-вывода).
Процессорное ядро РРЕ
Процессорный Power-элемент, или РРЕ, является управляющим элементом микросхемы Cell. РРЕ выполняет программы ОС и большинство прикладных программ, но наиболее ресурсоемкие вычисления производятся на SPE. При этом PPE выполняет и функции управления SPE.
РРЕ – 64-бит двухпотоковое RISC-процессорное ядро обладает упрощенной Power-архитектурой*, кэш-памятью первого уровня L1 емкостью 32 Кбайт, и 512-Кбайт кэшем второго уровня L2. В нем реализованы все инновации Power-технологии, в том числе поддержка виртуализации (логического разбиения памяти и портов ввода-вывода) и страниц большого размера. Фактически PPE может выполнять все существующие на сегодняшний день приложения Power-процессоров, а также поддерживать технологию гипервизора (Hypervisor), благодаря которой Cell-процессор может одновременно работать с несколькими ОС. По словам представителей IBM, на Cell могут одновременно функционировать виртуальная и реальная операционные системы. При этом архитектура PPE не полностью идентична процессорам PowerPC 970 или Power 5.
РРЕ можно условно разделить на три основных модуля (рис.2):
· Модуль командного устройства (Instruction Unit, IU), предназначенный для выборки, декодирования, ветвления, передачи и завершения команд.
· Модуль исполнительного устройства (execution unit, XU), выполняющий все операции с фиксированной запятой и все команды загрузки/хранения. Это устройство содержит 32ґ64-разрядный блок регистров общего назначения для каждого программного потока; блок выполнения операций с фиксированной запятой; блок загрузки/хранения.
· Модуль векторного скалярного устройства (Vector Scalar Unit, VSU), исполняющий векторные команды (совместимые с форматом AltiVec) и команды с плавающей запятой. Все команды представляют собой 128-разрядные SIMD-векторы размерности 2ґ64 бит, 4ґ32 бит, 8ґ16 бит, 16ґ8 бит или 128ґ1 бит. Модуль VSU обеспечивает отдельную очередь для выполнения векторных команд.
Конструкция РРЕ достаточно проста для эффективной работы на высокой тактовой частоте. Например, применяется только последовательное выполнение команд (in-order execution), в отличие от внеочередного выполнения команд (OOO – out-of-order execution), присущего большинству современных процессоров. При аппаратном применении OOO, процессор выполняет максимальное число команд одновременно. Однако этот механизм требует большого числа транзисторов, что ведет к увеличению потребляемой мощности. Кроме того, программный код, зависящий от результата предыдущих команд, должен исполняться последовательно, и в этом случае OOO-алгоритм только замедляет работу.
Будучи суперскалярным процессором, PPE может выполнять более одной скалярной (арифметической) команды за такт, т. е. обрабатывать два потока команд. Поддержка большего числа потоков потребовала бы объемного кэша первого уровня и усложнения архитектуры. Таким образом, для обработки двух потоков PPЕ имеет двухходовой конвейер длиной в 23 стадии. Если оба потока активны, процессор поочередно выполняет их команды. Если команда одного потока не может быть исполнена, например, из-за ожидания данных, команды второго потока могут выдаваться каждый тактовый цикл. Такое решение позволило упростить конструкцию процессора и уменьшить длину конвейера. Правда, процессор может работать нестабильно при выполнении программ с большим числом ветвлений. Для решения этой проблемы нужен очень хороший компилятор. Требования к компилятору ужесточились, так как в отсутствие аппаратной поддержки внеочередного выполнения команд и упрощенного модуля прогнозирования ветвлений большая нагрузка по планированию выполнения команд ложится на ПО.
Синергические процессорные элементы (SPE)
Если PPE – мозг Cell-процессора, то SPE – его мускулы, выполняющие самую тяжелую работу. Каждый SPE содержит 21 млн транзисторов, выполненных по 90-нм КМОП-технологии на кристалле размером 2,54ґ5,81 мм. Примерно 14 млн. транзисторов образуют матрицу памяти, остальные 7 млн. отвечают за логику. Один SPE, занимающий площадь кристалла, равную ~15 мм2, потребляет менее 5 Вт на 4 ГГц. Синергический процессор предназначен для сверхпроизводительного выполнения компьютерных и медийных приложений, требующих интенсивных вычислений. За счет передачи планирования выборки данных и предсказания ветвлений программным средствам удалось уменьшить площадь SPE и снизить энергопотребление.
SPE содержит два основных блока (рис.3):
1) Исполнительный модуль (Synergistic eXecution Unit, SXU), который представляет собой векторный SIMD-процессор. Оснащенный:
· 128-ю 128-разрядными регистрами;
· двумя блоками, выполняющими операции с плавающей запятой (производительность 32 Gflops);
· двумя блоками обработки целочисленных данных
(32 Gips) на частоте 4 ГГц;
· шестью портами ввода и двумя портами вывода;
· контроллером памяти (MMU – Memory Management Unit)
2) Локальная память (Local-store, LS), выполненная на базе
256-Кбит СОЗУ с конвейерной организацией и поддерживающая выборку четырех слов по 16 байт или строки 128 байт.
SPE не связаны непосредственно с PPE-ядром, а получают поток команд от собственной локальной памяти. LS – альтернатива традиционной кэш-памяти в архитектуре SPE. Подобно кэшу, LS – внутрикристальная память, но полностью отличается конструкцией и принципами работы. Локальная память SPE взаимодействует с основной памятью системы с помощью асинхронных команд прямого доступа (Direct Memory Access). Для выполнения команд DMA в каждый SPE входит блок управления памятью MMU, преобразующий эффективные адреса ядра SPE в реальные адреса общей шины данных. Одновременно поддерживается до 16 ожидающих выполнения команд DMA. Такая система обеспечивает необычайно высокую скорость обмена данных с регистрами SPE – 16 байт за цикл, или 64 Гбайт/с. Если одновременно имеют место операции LS с основной памятью и передача данных регистрам SPE, возникают "гонки" за право обладать ресурсом. Проблема разделения решена за счет применения 1024-бит шины данных между LS и буфером ввода/вывода, которая позволяет перемещать по 1024 бит за один цикл, что соответствует скорости передачи 0,5 Тбайт/с!
Самое главное, SPE – векторный (SIMD) процессор, который может выполнять одновременно несколько операций для одной команды. Подобный подход используется в графических акселераторах. Каждый SPE может выполнять четыре 32-битные операции за один цикл. Следовательно, для того чтобы добиться максимальной производительности, программы для SPE требуется векторизовать. Функции распараллеливания и векторизации кода поддерживаются многими современными компиляторами. Впрочем, если код не может быть представлен в векторном виде, это не значит, что SPE станет бесполезным. SIMD команда может состоять из одной операции программы и трех NOP (no operation). В этом случае SPE будет работать как обычный RISC-процессор с двумя потоками последовательно выполняемых команд.
Одно из отличий Cell-процессора от обычного центрального процессора – возможность объединения нескольких SPE. Они имеют доступ к локальной памяти друг друга, что позволяет задействовать больше инструментов программирования. Например, можно составить цепочку из SPE для потоковой обработки данных. Допустим, первый синергический процессор получает входные данные, обрабатывает их и сохраняет результат в своей локальной памяти. После этого следующий SPE считывает результат из указанного LS, обрабатывает и подает на выход. Другой путь максимального использования ресурсов SPE – делать каждую подпрограмму полноценной программой. Так называемые "программные клетки" передаются на выполнение "клеткам" аппаратным. Если задача может быть полностью решена на одном SPE (например, когда весь блок обрабатываемых данных помещен в LS), то в дальнейшем не нужно обращаться к основной памяти, что позволяет существенно повысить производительность.
Исполнительные блоки SPE работают с 128-битовым потоком данных. Большой набор регистров позволяет компилятору перераспределять порядок выполнения групп команд для уменьшения задержек. Одновременно может быть исполнено не больше двух команд. При этом первый поток поддерживает операции с фиксированной (2 цикла) и плавающей (6 циклов) запятой, а второй – операции загрузки/сохранения (6 циклов), перестановок байт и ветвлений.
Другое интересное свойство SPE-процессоров – возможность изолировать некоторые участки памяти. Процессы, предназначенные для выполнения задач защиты, недоступны другим ресурсам системы. Поэтому можно отказаться от специализированного процессора защиты данных, в том числе, при реализации будущих средств цифрового управления правами (Digital Rights Management, DRM). Поскольку Sony планирует максимально широко применять Cell в своих разработках, внедрение DRM в устройства на основе Cell представляется необходимым.
Контроллер потока данных памяти (MFC) и шина взаимосвязанных элементов (EIB)
Продолжая аналогию с живым организмом, можно сказать, что MFC – сердце, а шина EIB – кровеносная система процессора, подводящая к его элементам "животворный" поток данных. Чтобы обеспечить работу Cell-процессора, MFC поддерживает одновременно более 128 запросов к памяти и несколько одновременных транзакций.
Блок MFC связывает шину EIB с основной памятью системы, т. е. внешней памятью Rambus, а также перемещает данные между SPE и PPE. Транзакции могут иметь размер до 16 Кбайт. Однако они оптимизированы для длины строки в 128 байт. MFC может непосредственно загружать данные из SPE в L2 кэш и, тем самым, быстрее передавать их PPE.
Для поддержки множества устройств, входящих в Cell-процессор, специалисты IBM решили пожертвовать минимальной задержкой в пользу обеспечения более высокого уровня параллелизма и большей пропускной способности. Шина взаимосвязанных элементов EIB (Element Interconnect Bus) имеет кольцевую структуру, т. е. состоит из четырех однонаправленных кольцевых 16-разрядных шин. Кольца представляют собой буферную связь типа "точка-точка". Поэтому, если в структуру Cell будет добавлен еще один SPE, увеличится только максимальная задержка кольцевой шины. По двум из них данные передаются в одном направлении, по двум другим – в противоположном. Передача происходит с частотой, равной половине тактовой частоты PPE. Два устройства, передающих данные по EIB, могут задействовать одновременно до трех кольцевых шин. Теоретически максимальная скорость передачи данных по EIB составляет 96 байт за цикл (384 Гбайт/с), однако, по мнению разработчиков компании IBM, на практике этот параметр не превысит 60% от данного значения.
Контроллеры интерфейсов памяти и ввода-вывода
При разработке основной акцент делался на быстродействии. Поэтому требовались память и система ввода-вывода крайне высокой пропускной способности. Это побудило STI обратиться к опыту Sony и Toshiba, использовавших в игровой платформе PlayStation 2 технологию Direct RDRAM фирмы Rambus, и лицензировать для Cell-процессора контроллер внешней памяти XDR RAM и высокоскоростной интерфейс ввода-вывода Flex I/O.
Пропускная способность контроллера внешней памяти Cell-процессора с внешней памятью XDR RAM равна 25,6 Гбит/с. Столь высокие скоростные показатели XDR RAM достигаются за счет инноваций фирмы Rambus. Имеется в виду обработка дифференциальных пар сигналов DRSL (Differential Rambus Signaling Levels) и технология ODR (Octal Data Rate), которая позволяет передавать по 8 бит за такт. В DRSL дифференциальная пара сигналов передается при очень малых колебаниях: от 1,0 до 1,2 вольт. Малые значения амплитуд сигналов позволяют избежать наводок, а также увеличить скорость передачи информации. Технология ODR обеспечивает при собственной частоте контроллера памяти в 400 МГц передачу данных на скорости 3,2 ГГц. Каждый канал контроллера XDR RAM – восьмиразрядная шина. Поскольку в Cell-процессоре используется двухканальный контроллер (6,4 Гбайт/c) на четырех схемах, скорость работы с памятью равна указанным 25,6 Гбайт/c. При этом максимальный объем памяти XDR RAM не превышает 256 Мбайт.
Интерфейс высокоскоростной шины Flex I/O (ранее – Redwood), также полученный STI по лицензии у фирмы Rambus, применен в контроллере шины ввода-вывода. Он соединяет EIB с внешними устройствами (возможно, другими Cell-процессорами). Шина Flex I/O состоит из 8-битных каналов, пяти на вход и семи на выход. Пропускная способность одного канала, обеспечиваемая 96 дифференциальными сигнальными парами, составляет 6,4 Гбайт/с. Пропускная способность шины Flex I/O – 44,8 Гбайт/с на выход, и 32 Гбайт/с на вход. Суммарная скорость – 76,8 Гбайт/с. Отметим важное новшество в шине Flex IO – технологию автоподстройки фаз сигналов FlexPhase. Благодаря собственному генератору тактовых импульсов данный интерфейс позволяет синхронизировать сигнал между контроллером и блоком памяти или внешними устройствами. Поэтому на платах можно использовать дорожки разной длины – FlexPhase выровняет фазы за несколько пикосекунд.
Модели программирования Cell-процессора
Рассмотрим вопрос программирования Cell. Создатели процессора, упростив его архитектуру и убрав аппаратную поддержку некоторых функций, усложнили жизнь программистам. Задача поиска оптимального кода решается компилятором, при этом требует управления памятью в явном виде с помощью DMA-команд. С другой стороны, отсутствие кэша и строгая очередность выполнения команд сделали поведение процессора гораздо более детерминированным. Векторная архитектура позволяет хорошо проработанному компилятору исполнять за один такт несколько одинаковых скалярных команд (что, впрочем, можно отнести и к трудностям). Основные же сложности при программировании Cell аналогичны проблемам программирования многоядерных процессоров.
PPE может программироваться как типичный процессор Power-архитектуры. Для использования SPE разработчики предложили несколько моделей, которые уже можно реализовать на ОС Linux. Для этого произведены соответствующие дополнения в компиляторе GCC и отладчике GDB. Языком программирования Cell-процессора является язык С, с ограниченной поддержкой С++, однако допускаются и вставки ассемблерного кода с DMA-командами. Тем не менее приложения, рассчитанные на традиционную архитектуру процессора, придется значительно изменить. Прежде всего, программное приложение нужно привести в соответствие с набором команд PowerPC. Затем следует определить, какую часть вычислений производить в SPE. Лучше всего с его помощью решаются небольшие циклические или векторизуемые задачи. После преобразования программного кода в форму самодостаточной подпрограммы, полученное задание можно передавать SPE и векторизовать для наиболее полного использования преимуществ SIMD-команд.
Кроме того, для Cell-процессора разработана система интерфейсов тестирования, которые поддерживают такие функции, как сброс по включению питания и самотестирование, отладка аппаратных средств, управление и контроль режима питания и теплового режима. Конструкция процессора допускает управление различными состояниями защелки ("фиксация", "сканирование", "функционирование") на каждом машинном цикле, что помогает в отладке и проверке работы процессора на рабочей частоте.
Что дальше?
Планы по расширению новой технологии обширны. Так, в микросхеме Cell-процессора планируется использовать оптические соединения. Конструкция самого процессора также допускает ряд изменений: число применяемых SPE и число блоков обработки с фиксированной и плавающей запятой может варьироваться; возможна замена некоторых SPE блоками ввода-вывода или графическим процессором (компания Nvidia разрабатывает графические устройства для платформы PlayStation 3, которые, вероятно, будут использоваться в модифицированном Cell-процессоре). Увеличится и число транзисторов на кристалле. В патенте на новую конструкцию говорится о размещении на кристалле четырех процессоров. Однако это дела отдаленного будущего, поскольку стоимость такой микросхемы будет чрезвычайно высокой.
Уже сейчас компании IBM, Sony и Toshiba разработали процессор с необычной архитектурой и сверхвысокой производительностью. Благодаря поддержке параллельного выполнения операций с плавающей запятой Cell можно рассматривать как виртуальный суперкомпьютер на одном кристалле. В то же время PPE является традиционным процессором с упрощенной архитектурой. Это позволяет применять Cell не только для задач обработки графики и пр., но и для программ общего назначения. Недавние тесты подтвердили чрезвычайную эффективность Cell в типичных вычислительных задачах: быстрое преобразование Фурье, перемножение матриц, обработка стенсилов. Благодаря отказу от некоторых ресурсоемких аппаратных функций и применению новых контроллеров памяти и ввода-вывода, STI, похоже, действительно разрешили проблему взаимодействия процессора с памятью. Не менее важно и то, что Cell удалось избежать необоснованной траты транзисторов в гонке за законом Мура. По своим характеристикам Cell опережает всех конкурентов, что, однако не гарантирует ему коммерческого успеха.
Предыдущая статья:
Смарт-карты как средство защиты информации и программ. Содержание Следующая статья:
Synopsys в Армении: Слагаемые успеха. Интервью с вице-президентом стратегического рынка компании SYNOPSYS Ричем Голдманом
Оставить комментарий >
Имя: (обязательно)
E-mail: (не публикуется)
Комментарий:
Введите
контрольный код: Cryptographp PictureReload