Здравствуйте! Я прочел в интернете про технологию CUDA. Мне более-менее все понятно, за исключением одного. Почему нельзя просто перенести аппаратную составляющую графических процессоров на обычные центральные процессоры? В этом случае CUDA не нужна. Почему на центральный процессор не добавить больше ядер, как это делается на графических процессорах?
Современные графические процессоры включают в себя тысячи ядер, которые сами по себе достаточно примитивны, т.е. не могут выполнять сложных вычислений. Эти ядра комбинируются в мультипроцессоры, являющиеся по сути векторными машинами. Такая архитектура, которую часто называют SIMT, индуцирована историей развития GPU и связана с задачей растеризации, которая очевидным образом распадается на практически несвязанные примитивные подзадачи по закрашиванию пикселей. Т.е. GPU - это не “такой CPU, в котором много ядер”, это принципиально другое устройство.
Кстати, CPU и GPU не так уж отличаются по своему вычислительному потенциалу (читаем статью от Intel “Debunking the 100X GPU vs. CPU Myth: An Evaluation of Throughput Computing on CPU and GPU”). Теоретически, вы можете добиться одинаковой или близкой производительности между GPU и CPU, если “эффективно” реализуете свой алгоритм с использованием SIMD центрального процессора. Тут правда ключевое слово “эффективно”. Сделать это эффективно сложно и дорого (в смысле затраченного программистом времени и уровня требуемой от него квалификации). Но писать на CUDA тоже сложно. По крайней мере, делать это хорошо — сложно. Вообще, я думаю, что решение, какое устройство использовать как исполняющую платформу, должно приниматься исходя из свойств решаемой задачи. Например, CFD традиционно принято делать на GPU и прирост относительно CPU там получается почти в 100 раз (если код под GPU написан “грамотно”). Решать эти задачи на CPU намного сложнее.
"Современные графические процессоры включают в себя тысячи ядер, которые сами по себе достаточно примитивны, т.е. не могут выполнять сложных вычислений. Эти ядра комбинируются в мультипроцессоры, являющиеся по сути векторными машинами." Почему так нельзя сделать в CPU?
"Такая архитектура, которую часто называют SIMT, индуцирована историей развития GPU и связана с задачей растеризации" Почему нельзя взять лучшее из истории GPU для создания CPU?
Потому что у CPU совершенно другая архитектура. Т.е. если вы сделаете такой “CPU c большим количеством простых ядер”, то вы утратите универсальность CPU и более того, многие задачи на таком CPU будут работать даже медленнее, чем на традиционном. Сделать CPU c большим количеством сложных ядер вы не можете ввиду ограничений, накладываемых современной степенью интеграции микросхем. По тем же причинам не получается встроить мощный GPU в ядро CPU. Но шаги в этом направлении делаются.
Так уже делали в процессоре IBM Cell. То, что получилось в результате, оказалось безумно трудно программировать, хотя потенциал у процессора был.
Короче говоря, есть спектр задач (как CFD например), которые более естественно ложатся на архитектуру GPU, потому соответствующие расчеты и делают на GPU (а уж какой toolchain выбирать, CUDA, OpenCL, или вообще GLSL/HLSL — это дело вкуса). Конкретно CUDA просто является наиболее развитой технологией, которую проще применять при том же конечном результате.
То есть разумное использование GPU подходит только для конкретных задач? CPU же работает лучше в среднем?
Честно говоря, не совсем понимаю, что вы имеете ввиду. Что значит, “лучше работает в среднем”? CPU лучше подходит для выполнения преимущественно последовательного кода с ветвлениями. GPU лучше выполняет массивно параллельный код, т.е. алгоритмы, распадающиеся на большое количество простых подзадач, которые могут быть выполнены независимо “почти” без коммуникации друг с другом.
В частности, на GPU как правило намного лучше выполняются различные конечно-элементные и сеточные численные методы. Это не просто “конкретные задачи”, это очень обширные и сложные области инженерии, требующие высочайшей квалификации разработчиков. Очень многие алгоритмы распознавания изображений, для которых необходим попиксельный анализ входных данных, тоже, очевидно, лучше реализуются на GPU. Наконец, на собственном опыте могу подтвердить, что графические процессоры можно удачно применять для реализации алгоритмов компьютерной томографии, работающих в реальном времени. Короче, приложений много. Все зависит от постановки задачи и от ресурсов, отведенных на ее решение.
А почему нельзя просто в современных компах делать два процессора: один отвечает за последовательный код, а второй за параллельный? Зачем использовать графический процессор, который изначально все-таки предназначен для видео, и при его использовании мы все-таки не выжимаем полную выгоду? Зачем сидеть на столе, если можно построить стул? Пусть будет три процессора: последовательный CPU, параллельный CPU и GPU.
Вот их два и используется: CPU и GPU.
Современный графический процессор ни для чего “изначально” не предназначен, это просто набор мультипроцессоров, а уж что на них считаться будет вообще не важно. Обратите внимание на “видеоплаты” серии Tesla. На них даже видеопорт отсутствует, т.е. вы к ней монитор подключить не сможете. Это устройство чисто для раcчетов.
Еще раз, в качестве “параллельного CPU” есть Tesla, но в обычных компьютерах она не нужна.
Понятно. Спасибо.