Цитата:от: Gregory S. Linschitz
Давайте по порядку.
Давайте :)
1. Оверхед С++ :-) Петросян просто отдыхает.
Ну скажите, пожалуйста, зачем на видеокарточку тащить все эти таблицы виртуальных методов, конструкторы-деструкторы
и прочую семантику, выливающуюся в совершенно лишний для выполняемой задачи код? Мало того, чтобы это было более
похоже на C++, еще нужно, хотя бы, всю стандартную C++ либу со всеми её стандартными классами. Nvidia и без того
реализовала стандартную библиотеку языка Си, что для базиса к вычислительным применениям более чем достаточно.
Хотя, никто не запрещает, если очень хочется. Кроме того, на Си пишется только код, непосредственно работающий на карточке.
2. Обычный код распараллелить на сотне процессоров, эмуляторы .Net/Java от NVIDIA ?
Архитектура gpu от nvidia достаточно специфическая, я ещё не до конца разобрался, но там кажется основной упор сделан
не на разный код на разных процессорах, а на кластеры из одинакового кода, параллельно исполняющегося и
обрабатывающего разные данные из общей памяти. В первую
очередь распараллелить надо алгоритм, например,
перемножение матриц, записанное в матрично-векторной
форме почти идеально укладывается в концепцию работы gpu.
Или возвращаясь к фотографической тематике, дебайеризации RAW файла, например. Сейчас она естественным образом
делается на основе матрицы из четырёх элементов (RGGB), но никто не мешает применить матрицу ( 8 x 8 )
или даже (16x16), чтобы добиться лучшего качества изображения. В GPU это должно элементарно получиться.
3. Вы вообще представляете как это работает, 2 функции это в 3-4 раза дороже чем 1. Это в 3 раза больше работы
программистам (код+интеграция) в 4 раза больше работы тем кто проверяет ( 2*(код+интеграция) ),
кстати стадию архитекта я опустил....
Ну не так всё страшно, можно подумать, весь проект в 3-4 раза подорожает.
Тем более, что в реальности получаются не 2 функции, а одна с небольшими модификациями
и таким образом на самом деле давно пишут. А если использовать эмуляцию, то вообще строго
одна функция.
Или вот, почитайте:
http://kosmoflyko.blogspot.com/2008/05/geforce-9800-gx2.html
Здесь вообще софт для томографа не поленились переписать, чтобы использовать компьютер за $5300 вместо $4.6M.
Исследовательской группе Vision Lab удалось создать компьютер
на базе четырёх двухчиповых видеокарт GeForce 9800 GX2, который при стоимости
не более $5300 способен приблизиться по быстродействию к суперкомпьютеру стоимостью $4,6 млн.,
если речь идёт о скорости обработки результатов компьютерной томографии.
Например, на построение среза изображения органа настольная система Fastra PC тратит 35,1 секунды, а
суперкомпьютер на базе 512 процессоров - 23,4 секунды. Реконструкция срезов отображается после 67,4 секунды на
суперкомпьютере, и после 52,2 секунды на системе Fastra PC.
4. В среднем добваление второго ядра дает 25-30% производительности, третьего это + еще 10% и так далее....
Это средняя температура по больнице. Многое зависит от конкретных ядер и конкретных программ. Например, для 3D рендеринга производительность с добавлением ядер растёт практически линейно и у меня на 4-х ядрах сцена считается почти точно в 4 раза быстрее, чем на одном.
Или надо точить код под архитектуру, этого не делается даже в более дорогом и серьезном оборудовании.
Делается. Там где нужен реальный результат, очень даже делается, пример с томографом я уже привёл. Но есть и более простые случаи. Например, компьютерные игры, которые выпускаются в версиях для Xbox и для PC, а уж в них действительно надо точить под совсем разные архитектуры (современный Xbox даже не x86)
5. У ФШ даже конкурентов нет на ближайшие 3-4 года, так что пункты 3 и 4 просто нереально, им это не надо. Как эксперимент да но не как рабочая версия
Вот это очень возможно. Монополизм :(
Хотя заманчиво ускорить хотя бы некоторые виды работы в десятки раз и конкуренты у фотошопа, всё-таки, имеются. Если не сделают в фотошопе, кто-то все-равно реализует. Хотя бы в виде специализированного софта, ориентированного на конкретные функции или в виде плагинов к фотошопу.
6. Попробуйте отниситься более критично к тому что читаете, в обзорах популярной фантастики.
Ну почему же сразу фантастики. Я заинтересовавшись этой технологией, взял нужную карточку и поставил nvidia cuda sdk. Там в этом sdk немало примеров программ, действительно работающих с серьёзной скоростью. В частности, imageDenoising фотографию 3000x2000 обрабатывает менее чем за секунду, визуально результат шумоподавления возникает мгновенно после нажатия клавиши. Мне понравилось :D
7. Сейчас говорил с народом который пишет игры ( серьезно пишет ) если надо очень быстро рисовать 3Д для игр то FPU одтыхает, даже с 2-3-4 ядрами, но если надо просто 2+2 складывать с нелинейной коррекцией, то дополнительное ядро современного FPU уделает любой и даже спаренный GPU.
Возможно. GPU не панацея и не 100% замена обычному компьютеру. А что такое 2 + 2 с нелинейной коррекцией?
8. Я готов поверить, что матричные фильтры можно перенести в GPU, все понятно как оно работает, но самое главное это интерективные инструменты и отрисовка при сложении 10-100 слоев + маштабирование. А это сомнительно, потому как там все не так линейно и тривиально как в GPU привыкли.
Общий подход, как я понял, это перекладывание на GPU похожих операций над большими объёмами данных. Дело не в линейности, а именно в одновремённой обработке данных. Сам код может быть и не очень тривиальным, вот кусочек исходников из примера в SDK кода для gpu-процессора в ImageDenoising:
//Find color distance between (x, y) and (x + j, y + i)
float weightIJ = 0;
for(float n = -NLM_BLOCK_RADIUS; n < = NLM_BLOCK_RADIUS; n++)
for(float m = -NLM_BLOCK_RADIUS; m < = NLM_BLOCK_RADIUS; m++)
weightIJ += vecLen(
tex2D(texImage, x + j + m, y + i + n),
tex2D(texImage, x + m, y + n)
);
//Derive final weight from color and geometric distance
weightIJ = expf( -(weightIJ * Noise + (i * i + j * j) * INV_NLM_WINDOW_AREA) );