Все мы знаем что для больших задач нужны титаны, а для решения задач программирования нужны титаны вычислительных мощностей. Рано или поздно мы подходим к границе вычислительных возможностей нашего рабочего компьюетра. И как нам хочется большего: перелапачивать больше чисел, ускорить бэкфорвардное тестирование. Может попробовать суперкомпьютер? Но цены на них реальными не назовешь. Что оставалось нам в прошлом Вдыхать и мечтать, но как известно люди – беспокойные создания. И нашлись энтузиасты, приспособившие новые технология для своих «утилитарных» нужд расчетчиков.
Вообще-то специальные устройства, позволяющие превратить свой настольный компьютьер во что-то куда более быстродействующее, чем он обычно является, известны довольно давно, ещё с середины 80-х годов. Такая платка от фирмы INMOS, называвшаяся транспьютером и вставленная в ISA-слот могла дать до 20-30 полноценных MIPS, что было довольно круто для того времени. Но в дальнейшем они стали отставать от роста быстродействия обычных процессоров, и в конце-концов INMOS свернула их производство, не сумев поддержать достойную производительность. Были и есть и другие устройства подобного рода, всякого рода специализированные ускорители, часто их сфера применения чрезвычайно узкая и ограничена единственной профессиональной программой. Мало кто их видел и мало где они продаются.
Но в последнее время наметилась совершенно явная тенденция к выпуску на массовый рынок более-менее универсальных устройств, в которых стоят многоядерные процессоры с параллельными векторными вычислениями, за счёт чего достигается реальная (а не маркетинговая) пиковая производительность около 200-300 GFlops. Внушительная величина, ещё всего 6 лет назад компьютеры с подобным быстродействием входили в Top-500 суперкомпьютеров. И хотя подобное быстродействие достигается не на всех задачах и имеется ряд других ограничений, тем не менее, сфера применения достаточно широкая и практически востребованная, чтобы впечатлиться. Особенно, если использовать не одно устройство, а сразу несколько.
Реально такими устройствами являются игровая приставка Sony Playstation-3, Xbox360 и более-менее совремённые видеокарточки от NVIDIA и от AMD (бывшие ATI). Нетрудно обратить внимание, что всё это в основном предназначено для игр и только для игр. На самом деле ничего удивительного, игры, пытающиеся моделировать окружающий мир, всегда были жадными до вычислительных возможностей. «Матрица» требует много вычислений Между прочим, в черновом варианте сценария к фильму, в Матрице люди использовались не как батарейки, а как элементы вычислительной системы. Жаль, что сценарий изменили, первоначальный вариант был, по-моему, логичнее и интереснее.
В настоящее время и приставки PS3 и видеокарточки позволят проводить вычисления общего назначения, а не только играть в игры. Исключение – Xbox, Microsoft тщательно оберегает покупателя приставки от использования её не по игровому назначению. Остальные производители, кто в большей, кто в меньшей степени, не только не препятствуют проводить произвольные вычисления, но даже поощряют подобный интерес.
Хотя, всё-таки, не без ограничений. Sony не даёт напрямую воспользоваться всеми компонентами PS3, Nvidia не собирается раскрывать низкоуровневые детали взаимодействия с процессором видеоплаты, а AMD хотя выполняя обещания открыть техническую документацию по программированию своих чипов, сделала крупные шаги к раскрытию спецификаций, всё ещё довольно много ключевых документов сохраняет закрытыми.
Вычислительными возможностями видеокарточек и PS3 уже воспользовалось немало людей, вот несколько примеров таких проектов:
- Кластер на видеокартах для астрофизических расчётов
- Кластер на основе PS3 и тоже для астрофизических нужд
- Рендеринг сложной трёхмерной сцены в реальном времени с помощью трёх приставок PS3
- Использование для томографии четырёх двухпроцессорных Geforce 9800GX2 вместо суперкомпьютера за $4.6 миллиона долларов»
- И т.д.
Кроме того, для PS3 и AMD Radeon серии 2xxx и 3xxx существует клиент для распределённых вычислений Folding@Home. В скором времени, его обещают написать и для карточек от nvidia.
Каким же образом обладатель приставки или видеокарточек может их запрограммировать для своих нужд?
Наиболее продвинутым в этом плане выглядит Sony Playstation-3, работающая на чипе Cell, производимом консорциумом из Sony, Toshiba и IBM. На сайте DevelopersWorks IBM размещено немало материалов по этому процессору и подробно объясняющих как писать для него программы, в том числе и для PS3. Хотя основное предназначение Cell не PS3, а высокопроизводительные сервера..
Для видеокарточек несколько лет назад зародилась целая технология, названная GPGPU General-Purpose computation on GPUs
Первоначально эксплуатировалась идея, что пиксельные шейдеры в видеокарточках стали очень умными и быстрыми и неплохо бы их как-то заставить рассчитывать не только изображение в играх (или CAD’ах), но и что-нибудь поинтереснее. Поначалу использовались разные извращения с OpenGL и DirectX, когда в видеокарточку под видом текстур передаются данные, а под видом шейдеров функции для их обработки. Недостатком оказывается повышенная сложность программирования и невысокая скорость обмена данными между видеокарточкой и основной системой в направлении от видеокарточки к системе. Ведь в играх, фактически нет нужды передавать данные обратно.
В настоящее время сами производители Nvidia и AMD предлагают поддержку вычислений на всех уровнях: аппаратном, сделав процессоры видеокарточек более универсальными и ускорив обмен данными, на уровне драйверов, предоставив универсальные механизмы не завязанные на OpenGL или DirectX и на пользовательском уровне, предоставив библиотеки, компиляторы и SDK с примерами программ и документацией.
У Nvidia это технология CUDA (Compute Unified Device Architecture) http://www.nvidia.com/object/cuda_home.html, доступная на чипах G80 и G92 в GeForce 8-ой серии и выше. В настоящее время, используется CUDA v1.1, но одновремённо с ожидаемым в июне этого года выпуском новых более производительных и с новыми возможностями видеокарт на чипе GT280 и GT260 (названия рабочие), выйдет и CUDA v2.0 с новыми возможностями. В частности, предполагается поддержка вещественного типа c двойной точностью (64 бит, double), пока что поддерживается только одинарная точность (32 бит, float). Версии CUDA существуют для Linux, Windows и MacOS X, как для 32-битных, так и для 64-битных систем.
Аналогичная технология и даже появившаяся немного раньше, чем у Nvidia, имеется и у AMD (ATI). Это CTM (загадочно названная Close to Metall) или AMD Stream Computing. Работает на видеокартах Radeon HD 2-ой, 3-й и выше серии. Готовые версии существуют только для 32-х и 64-х битных Windows, хотя недавно была выпущена бета-версия и для Linux. По сравнению с CUDA может быть быстрее в некоторых случаях и поддерживает 64-битный вещественный тип, хотя я встречал высказывания, что в целом программировать в рамках AMD Stream Computing немного сложнее, чем CUDA. Однако подробностей я не знаю и вообще, так вышло, в том числе и из-за плохой поддержки Linux, что моё внимание более привлекла CUDA.
Немного об аппаратном строении.
Cell в PS3. Состоит из управляющего PPE + 8 SPE.
PPE (Power Processor Element), RISC-процессор, фактически PowerPC, работающий на частоте 3.2 Ггц. Одно ядро, но с двумя конвейерами, представляющими аналог HyperThreading но, вроде бы более эффективный. Исполняет в среднем одну команду за такт и вследствие этого, общая производительность на фоне совремённых x86 процессоров скромная. Соответствует примерно 1 – 1.5 Ггц Pentium-III или Athlon. Написание программы с учётом особенностей HyperThreading может увеличить скорость работы где-то на 50%
SPE – так называемые, синергические обрабатывающие элементы. В PS3 один из восьми заблокирован с целью увеличения выхода годных изделий (Cell) и снижения себестоимости PS3. Другой – используется в гипервизоре, не пускающем обычного программиста куда с точки зрения Sony, ему не надо лезть. Например, в видеопамять (но не только). Таким образом, для обычного программиста доступен PPE и 6 SPE. SPU – представляет собой векторный процессор (SPU), объединённый с очень быстрой локальной памятью 256 Кб, у каждого SPU – своя.
G80 (в GeForce 8800)
Очень кратко, состоит из
1) 128-ми потоковых (thread) процессоров, также называющихся программируемыми пиксельными шейдерами.
Каждый такой процессор, содержит блок вычислений с плавающей запятой (FPU) и 1024 32-битных регистра.
FPU позволяет проводить вычисления только с одинарной точностью (32-битный вещественный тип float в Си)
8 потоковых процессоров объединены в кластер. Всего имеется 16 таких кластеров.
Каждый кластер имеет локальную общую память, объёмом 16 Кб, поддерживающую параллельный доступ к данным.
2) Устройства аппаратного распределения исполняемых потоков(thread), которое автоматически раскидывает
потоки по процессорам, избавляя от необходимости писать подробный управляющий код.
Максимальное количество, конкурирующих за процессоры, потоков 12288.
3) Общей памяти. 768 Мб у GeForce 8800 GTX и Ultra.
4) Текстурного кэша и так сказать обвязки,
В других картах, поддерживающих CUDA может быть другое количества процессоров, памяти и разрядность шины памяти.