Современные графические процессоры по-прежнему имеют много аппаратных средств с фиксированными функциями, которые скрыты от вычислительной APIS.Это включает в себя: этапы смешивания, растеризацию треугольника и множество очередей на кристалле.Конечно, все шейдеры хорошо отображаются в CUDA / OpenCL - ведь шейдеры и языки вычислений используют одну и ту же часть графического процессора - ядра шейдеров общего назначения.Воспринимайте эти блоки как набор очень широких процессоров SIMD (например, GTX 580 имеет 16 ядер с модулем SIMD шириной 32).
Вы получаете доступ к текстурным блокам через шейдеры, так что естьнет необходимости реализовывать это в «вычисления».В противном случае ваша производительность, скорее всего, будет плохой, поскольку вы не получите доступ к кэшам текстур, оптимизированным для пространственного размещения.
Не следует недооценивать объем работы, необходимый для растеризации.Это серьезная проблема, и если вы добавите всех графических процессоров , вы получите примерно 25% производительности растрового оборудования (см .: Высокопроизводительная растеризация программного обеспечения на графических процессорах .)Это включает в себя затраты на смешивание, которые также обычно выполняются модулями с фиксированной функцией.
Тесселяция также имеет часть с фиксированной функцией, которую трудно эффективно эмулировать, поскольку она усиливает входной сигнал до 1: 4096, иВы, конечно же, не хотите зарезервировать так много памяти заранее.
Далее вы получаете много штрафов за производительность, потому что у вас нет доступа к сжатию кадрового буфера, так как для этого снова есть выделенное оборудование, которое"скрыто" от вас, когда вы находитесь в режиме только для вычислений.Наконец, поскольку у вас нет никаких очередей на кристалле, будет трудно достичь того же коэффициента полезности, который получает «графический конвейер» (например, он может легко буферизовать вывод из вершинных шейдеров в зависимости от загрузки шейдеров, вы можетене переключайте шейдеры, которые гибко.)