А где проводятся вычисления при работой с изображениями?
Сразу скажу, что никогда вообще в жизни не задумывался об устройстве видеокарт. Как бы не сталкивался, и не волновался.
А недавно узнал, что типа текстуры хранятся не в RAM а где-то в видеопамяти(вроде простая логика, но не задумывался). Сейчас изучаю подробно устройство процессоров, архитектуры. И тут на видеокарты перескочил, и не могу понять фундаментальное различие, кроме самых поверхностных. Типа какие данные где хранятся и где обрабатываются. Или почему 10000 операций сложения на GPU в 800 раз быстрее.(Точнее не почему, а почему Тогда Компилятор не оптимизирует и не переводит эти вычисления в видеокарту). Или почему я не видел таких примеров в учебниках.
К примеру, писал Нейронку год назад, по опознаванию цифр, по рисунку. С использованием с# Windows Forms, вопрос а где производились сравнения, сложения умножения? В GPU или CPU? Если в cpu, то логичнее их распараллелить в видеокарте, все эти однотипные простые операции умножения сложения. И логичнее тогда повесить ТАБУ, и во всех примерах использовать CUDA и прочие. Или в чем я ошибаюсь.
Нельзя просто так взять и перенести вычисления на GPU - для этого (на 2021 год) программа должна разрабатываться отдельно, с учетом возможностей и структуры этого самого GPU.
Главный плюс GPU - высокая степень параллельности на независимых данных. GPU может одновременно делать тысячи математических операций, при условии, что результат каждой из них не зависит от результата других - что часто встречается при обработке изображений - отсюда высокая скорость вычислений.
Однако, GPU может работать только с теми данными, что загружены в видеопамять и результат записывает тоже только в видеопамять, а ее, как правило, меньше чем обычной RAM.
Отсюда следует, что выиграть, считая на GPU, можно только тогда, когда данные независимы, хорошо умещаются в память видеокарты и успевают перекачиваться.
Вот у меня была программа Нейросеть определяла цифры, с использованием bitmap, где хранятся его пиксели, там было прям 100500 однотипных операций независимых, умножения сложения.
Получается надо подключать все эти CUDA или opengl что бы добиться в 100 раз большей производительности? Или где-то там кроется подвох, к примеру в скорости загрузки результатов?
И почему вообще нужно что-то подключать, почему если эта такая крутая фича, то она не встроена во все языки программирования.
Не встроена во все языки потому, что большая часть того, что делается на компьютере - однопоточная фигня типа штампования форм, а также потому, что разработка под GPU требует более дорогих программистов.
Из-за разницы в архитектуре, нельзя перенести код для CPU на GPU так, чтобы он был эффективен и там и там - это нужно писать специальным образом, а такое программирование стоит дороже и занимает больше времени, поэтому GPU применяется там, где это действительно нужно - в графике и научных расчетах.
Разница в заточенности GPU именно под определенный тип операций, из-за чего при с виду одинаковой мощности некоторые данные на GPU обрабатываются гораздо быстрее чем на CPU. Это как сейчас в Биткоинах - на GPU майнить можно, но Asic-чипы делают это гораздо шустрее т.к. заточены именно под криптооперации.
Компиляторы по умолчанию делают проект который должен работать на всем, CUDA есть далеко не везде. Поэтому если хотите использовать CUDA, то читайте как ее программировать
А почему нету своей реализации. Или компиляторы почему не могут увидеть к примеру код for(int i=0;i<10000; i++){ a=b+c;} и как-то автоматически его оптимизировать нагрузив видеокарту.
Или вот вопрос допустим есть Изображение, когда я получаю массив пикселей этого изображения, то где он хранится(в оперативки или нет), и допустим мне нужно умножитьвсе пиксели на 2, то где произойдет это умножение? Вот главный вопрос.
Даниил, компилятор C++ видит for(int i=0;i<10000; i++){ a=b+c;} и использует специальные инструкции CPU для того, чтобы ускорить эти сложения - и CPU делает это довольно быстро.
Чтобы это сложение сделать на GPU, нужно будет загрузить в GPU 20 000 интов, а потом выгрузить из GPU 10 000 интов. (Это в предположении, что вычислительное ядро уже откомпилировано и загружено в GPU, иначе придется компилировать и грузить еще и его, что уж точно займет больше времени, чем сложение этих чисел на CPU).
На 2021 год, если вы на C# явно не пишете, что хотите работать с GPU, вы работаете с обычной RAM и обычным CPU.