?

Log in

No account? Create an account

Мы должны знать, мы будем знать

А как вы используете свой GPU?
horror
iodiot
Немного истории. В середине 90х на рынке появилось несколько графических плат, которые ни много ни мало умели осуществлять 3D растеризацию. Конечно, самой популярной платой на то время была Voodoo Graphics от 3Dfx Interactive. Я до сих пор помню, как впервые играл в Half Life 1 в компьютерном клубе, графика была просто потрясающей, а возможность выбрать в опциях не “Software renderer” радовала сердце. Славные времена. Позже у меня тоже появилась эта плата, но переживания детства было уже не вернуть: видеокарта постоянно подвисала, отказывалась работать с 90% игр, сыпала программными исключениями и обильно сдабривала выстраданную картинку артефактами.  

hl1

Конечно, возможности данной платы были весьма ограниченными с современной точки зрения. Никаких шейдеров, никаких вершинных преобразований. CPU осуществлял всю работу, а затем на вход графической платы передавал координаты треугольников для растеризации. Такой себе отлитый в кремнии пиксельный шейдер. Вместе с координатой вершины также можно было передать координату текстуры и RGBA цвет. Координата текстуры использовалась для доступа к единственной текстуре (неожиданно, да?), а интерполированный цвет можно было комбинировать со значением, извлеченным из текстуры, с помощью ограниченного множества операций. Альфа-канал тоже поддерживался. Если опустить некоторые другие детали, то на этом возможности Voodoo Graphics полностью исчерпывались. Все это не шло ни в какое сравнение с утонченными программными рендерами, но в контексте чистой мощности Voodoo Graphics был просто монстром. Вычислительная революция также имела и отрицательные стороны, в частности, большинство трехмерных игр тех времен были малоотличимы друг от друга в графическом плане.

Современные GPU шагнули далеко вперед. На их фоне архаичная Voodoo Graphics выглядит паровым двигателем на дровах, тем не менее, сохранилась преемственность в подходе: растеризировать максимальное количество треугольников за единицу времени. Но если раньше процесс растеризации или вообще было невозможно контролировать или контролировать с помощью ограниченного набора вызовов типа glLight, то теперь у нас есть шейдеры и это прекрасно. Для тех кто в танке, шейдеры — это такие программы, написанные на специальном языке (к примеру, GLSL или HLSL), которые исполняются на шейдерных процессорах. Про шейдерные процессоры я их хотел поговорить. 

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

GPU — это синоним чистой мощности. Количество процессоров исчисляется сотнями, мегагерцы зашкаливают, пропускная способность… присутствует. Да, пусть эти шейдерные процессоры не такие «умные» как центральные процессоры от Intel, но когда речь идет о гигафлопах другого и не нужно. 

bmwx6xdrive50iengine

Мое близкое знакомство с GPU началось с год назад. Тогда я и не подозревал, насколько увлекательней может быть программирование, когда у тебя под рукой огромные вычислительные мощности. Но за все нужно платить, хотя бы потому что обычная программа на С/C++ скорей всего откажется исполняться на шейдерном процессоре. Да и вообще сама парадигма программирования GPU имеет мало общего со всем тем, что нам приходится кодить изо дня в день.

Здесь важно отметить, что использовать GPU по назначению, т.е. для растеризации громадного количества треугольников, как правило, не очень интересно, если вы конечно не пишите очередного убийцу CryENGINE. Всегда есть исключения, но в основном это неблагодарное занятие, для которого отношение «вау-эффект / количество кода» стремится к нулю. Так я и познакомился с такими разношерстными областями человеческой деятельности как рейтрейсинг, объемный рендеринг, симуляция жидкости/дыма, рендеринг на основе функций-дистанций, включая всеми любимые фракталы, на этот раз трехмерные. Но об этом я напишу как-нибудь в другой раз. Обязательно. Наверное. 

Я много раз употреблял прилагательное «огромный» в применении к существительному «мощность». Пора бы все выразить и в конкретных цифрах. За эталон можно взять… правильно, компьютер, который отправил человека на Луну, а именно Apollo Guidance Computer (AGC). 

agc

Существует миф, что процессор любого современного карманного калькулятора мощнее AGC. Может это и не миф. AGC обладал 2 килобайтами оперативной памяти, 32 килобайтами памяти только для чтения, 4 регистрами общего назначения и процессором с тактовой частотой в 4,077 МГц (или 0,004077 ГГц).  Если предположить, что данный процессор выполнял одну инструкцию за один такт, то его вычислительная мощность равнялась:

Вычислительная мощность AGC =  1 * 0,004077 ГГц  = 0,004077 гигафлоп

Вроде как немного. На моем домашнем компьютере установлена видеокарта не первой свежести NVidia GeForce 9800 GT. По этой ссылке можно обнаружить, что мощность данной видеокарты составляет:

Вычислительная мощность GPU = 504 гигафлоп

Вроде как много. Интересно найти отношение между вышеуказанными мощностями:

Мощность GPU / Мощность AGC = 504 гигафлоп / 0,004077 гигафлоп = 123620

Чистый прирост в сто двадцать три тысячи шестьсот двадцать раз. Неплохо. Если старый AGC отправил человека на Луну, то новый GPU способен отправить его в 3,3 раза дальше, чем текущее расстояние от Солнца до спутника Вояджер. К сведению, Вояджер это самый дальний объект, сконструированный человеком. И к сведению, такое расстояние свет проходит за два дня.

Конечно, сравнивать технологию 60х годов с технологиями нашей эры не совсем спортивно и не совсем законно. Поэтому вернемся опять к моему домашнему компьютеру, на котором установлен центральный процессор Intel Core2 Duo E4000. На этом сайте можно подсмотреть вычислительные мощности всей линейки процессоров Intel и для моего процессора она равняется:

Мощность CPU = 14,4 гигафлоп
Мощность GPU / Мощность CPU = 504 гигафлоп / 14,4 гигафлоп = 35

Теперь прирост не такой огромный: всего в 35 раз. Правда, здесь не все так просто. Эти гигафлопы рассчитаны на основе чисел двойной точности и т.н. MAD (Multiply-Add) инструкций, когда за один такт выполняются две арифметические операции. 

С практической точки зрения это означает, что различные интересные рендеры и не только можно в реальном времени (60 кадров в секунду) выполнять на GPU и нельзя на CPU. С точки зрения чистого удовольствия и вау-эффекта это очень важно. О конкретных приложениях я во всей полноте напишу в последующих постах, а сейчас видео. Встречайте трехмерный фрактал Серпинского.

Volumetric Sierpinski from Ignat Grob on Vimeo.