Недавно я опубликовал статью о распределенном рендеринге на GPU — поступили некоторые вопросы и предложения. Поэтому считаю нужным рассказать о теме более развернуто (и с картинками, а то без картинок статьи практически не читают), тем самым привлечь к этой теме больше читателей.
Думаю, этим вопросом заинтересуются обладатели мощных вычислительных систем: майнеры, геймеры, админы других мощных вычислительных систем.
Многие обладатели мощного железа задумывались над тем, а нельзя ли подзаработать на мощности своей железки, пока она стоит бестолку?
Красота моя бестоковая!
Один из самых доступных способов — это Bitcoin. В связи с появлением распределенной платежной системы Bitcoin появилось такое интересное занятие — майнинг («добыча биткоинов», вычисления в пользу защиты биткоин системы, за которые система вознаграждает участника биткоинами, которые он может обменять на одну из известных валют в биткоин биржах) — занятие достаточно затратное, и не всегда прибыльное. Вернее майнинг оказался более прибыльным на FPGA-шечках, чем на Радеончиках. Поэтому обладателям последних повезло меньше, в плане майнинга, и им приходится продавать свои железки.
Майнинг ферма, я насчитал 66 видеокарт. Красотища! Взято отсюда.
Я сам пробовал недавно помайнить на GTX580 (а Нвидии плохи для майнинга, да), но понял, что 17 (семнадцать) долл. в месяц — хоть и бешеные деньги, но не совсем та зарплата, о которой я мечтал.
Но не спешим впадать в спячку отчаяния! Можно попытаться спасти положение!
Итак, мощные видюшки, при правильном использовании:
1. Могут служить во благо кому-то.
2. Могут приносить больше прибыли, чем Биткоин.
3. Приносить прибыль от Биткоин во время простоя.
В чем же могут пригодиться видеокарты?
1. Вычисления общего назначения на видеокартах (англ. General Purpose Graphic Processor Unit — GPGPU).
2. Аппаратная растеризация (OpenGL, DirectX).
Начнем с GPGPU
Как задействовать видеокарты?
CUDA — хороший френймворк для карточек Nvidia, и только для них. Аппаратно-зависимая платформа.
Firestream — фреймвор для GPGPU вычислений на видеокартах AMD. Опять-таки аппаратно-зависимая платформа. Честно, я даже не встречал ни одного рендера на Firestream.
OpenCL — аппаратно, и программно-независимая платформа для вычислений на чем попало: и CPU, и GPU, на тостерах и микроволновках. Всё прекрасно, но на личном опыте, и многочисленных тестах убедился, что платформа пока что далека от совершенства. Глюки, баги, плохая оптимизация. Может пишут на нем кривыми ручками? Не знаю, может кто-то в комментариях выскажет.
HLSL — шейдерный язык DirecrX. Что такое шейдерный? На нем пишут алгоритмы закрашивания поверхностей в DirectX. Даже один товарищ сделал рендер на HLSL. Всё бы ничего, но платформа программно-зависимая. Только DirectX от Мелкомягких.
DirectCompute — прикладной (к DirectX, к чему еще) язык программирования от Мелкомягких. Частенько, с помощью него на видеокарты вешают физику.
GLSL — шейдерный язык OpenGL. А OpenGL, как мы знаем, поддерживает подавляющее большинство железок, работает на Windows, Linux, OSX. Так что вариант вроде бы самый выигрышный. Честно, серьезного софта я на нем не видел, но думаю, есть повод задуматься. Попробовать, а не искать оправдания, почему его не используют.
В негра-фических вычислениях GLSL пользуется популярностью в WebGL приложениях. Можете сами посмотреть как работает unbiased render на WebGL, и мышкой помешать пиксели на экране.
Есть ролик, показывающий производительность кода, написанного с помощью разных фреймворков на Nvidia GeForce GTS250 и Core i5.
Это видео — не абсолютный показатель. Во-первых инфа могла устареть, а вдруг, OpenCL уже быстрее всех на свете? Во-вторых, GTS250 — это же не топовая видеокарта, чтобы оценивать производительность OpenCL на тех же майнинг фермах.
На мой взгляд, наиболее подходящие платформы:
1. GLSL в виду его универсальности, стабильности и скорости. Минус — неудобство программирования.
2. OpenCL — универсален, всеяден. Задействует все поддерживаемые CPU и GPU. Минус — есть недоработки.
3. Совмещать 1 и 2.
Задач, которые нуждаются в вычислениях на GPU великое множество. Инженерных, научных, финансовых, графических. Я же сконцентрируюсь на рендеринге (о котором я расскажу чуть дальше), так как занимаюсь графикой, и мне есть что сказать на этот счет.
Аппаратная Растеризация
Первое, что приходит в голову — облачные игры (см. Onlive). Облачная отрисовка игр — это когда требовательная к ресурсам игра рисуется удаленно, на вычислительном сервере, а готовая картинка со звуком присылается пользователю. Пользуются этим, если компьютер пользователя едва тянет эту же игру на самых низких настройках, или вообще несовместим с этой игрой.
Ролик о том, как на Android планшете можно играть требовательные к железу игры:
Итак, теперь вернемся к системе облачно-распределенного рендеринга, которую я хочу предложить.
ОБЛАЧНЫЙ РЕНДЕРИНГ
Или распределенный? Вернее облачный, только облако распределенное. Облачно-распределенный рендеринг.
Я бы хотел остановиться на рендеринге, но не на растеризации, а на более серьезных и глубоких алгоритмах, таких как unbiased рендеринг, о котором я уже всем уши прожужжал.
Как примерно выглядит unbiased рендер на GPU — на примере Octane Render (Nvidia CUDA)
Алгоритм хорош тем, что позволяет рендерить глобальное освещение (свет, отражения света, отражения отражений, отражения отражений отражений, и т.д.) в реальном времени, пусть и с большим шумом.
Но чем больше производительность железки — тем быстрее изображение прочищается от шума.
Но не бросать же в беде обладателей Радеонов! Есть рендеры, задействующие OpenCL:
Это Cycles Render (opensource), IndigoRT, SmallLuxGPU (тоже opensource)
SmallLuxGPU
Вообще, думаю, время покажет, что лучше: писать свой софт, или разбираться в чужом коде.
В каком виде подавать?
1. Через плагин 3d редактора.
2. Через браузер с жаваскриптом. Кстати, можно сделать что-то вроде «кинул ссылочку — показал кому-то 3д объект».
А как использовать эту систему: за деньги, или даром для друзей или ради интересного проекта — пользователи решат сами.
Может и задачи на CPU распределим?
Как мы знаем, графические видеоадаптеры обладают достаточно высокой (по сравнению с CPU) производительностью в многопоточных вычислениях. Но вовсе не обязательно списывать CPU со счетов. Есть задачи, которые очень сложны в написании, или нецелесообразны в использовании GPU.
Хотя, в целом, мое мнение отражает вот эта картинка:
Ну а пост без баяна — не пост.
Идеологическая составляющая проекта
Вычисления — лишь часть ресурсов, которые нуждаются в перераспределении. Одни нуждаются в производительном железе, у других оно стоит незадействованное. То же самое касается и других ресурсов: деньги, вода, пища, энергия, тепло. У одних избыток, не приносящий радости — у других недостаток, доставляющий дискомфорт.
Человечество нуждается в взаимопомощи во всех аспектах жизни. А рендеринг и распределенные вычисления — лишь малая часть ресурсов, которыми мы можем помочь друг другу. Все-таки целесообразнее задействовать существующие простаивающие мощности, чем покупать новые железки?
Это я к тому, что за распределенными вычислениями будущее! Я вовсе не утверждаю, что проект должен развиваться на голом энтузиазме, а разработчики — питаться святым духом.
ИТОГО
Если эта тема внезапно кого-то заинтересовала — предлагаю, товарищи, обсудить!
Автор: Marchevsky