Простой ответ заключается в том, что графический процессор работает лучше всего, когда вам нужно выполнить довольно небольшие, довольно простые вычисления для каждого из очень большого числа элементов. Чтобы добиться многого таким образом, вычисления для каждого элемента должны быть независимыми от вычислений для других элементов. Если есть (обычно) какая-то зависимость между одним элементом и другим, вам, как правило, нужно найти какой-то способ сломать его, прежде чем вы получите много от выполнения этого кода на GPU. Если зависимость не может быть нарушена вообще или требует слишком много работы для ее разрыва, код может выполняться быстрее на процессоре.
Большинство современных процессоров также поддерживают довольно много типов операций, которые современные графические процессоры просто не пытаются поддерживать вообще (например, защита памяти для многозадачности).
Если взглянуть на это с несколько иной стороны, процессоры были (в значительной степени) спроектированы так, чтобы быть достаточно удобными для программистов, а аппаратные специалисты сделали все возможное (и чертовски хорошо!) Для создания аппаратного обеспечения, поддерживающего эту удобную модель для программист, но по-прежнему выполняется максимально быстро.
Графические процессоры приходят к вещам с противоположной стороны: они спроектированы в основном так, чтобы быть удобными для разработчика аппаратного обеспечения, и такие вещи, как OpenCL, пытались обеспечить как можно более разумную модель программирования с учетом ограничений оборудования.
Написание кода для запуска на графическом процессоре обычно занимает больше времени и усилий (а значит, будет стоить дороже), чем выполнение того же самого на центральном процессоре. Таким образом, делать это в первую очередь имеет смысл, если / если либо:
- Проблема настолько параллельна, что вы можете ожидать большой выгоды от минимальных усилий, или
- Прирост скорости настолько важен, что оправдывает много дополнительной работы.
Есть некоторые очевидные возможности для каждого - но огромное количество приложений явно не близко ни к одному. Я был бы очень удивлен, увидев (например) приложение CRUD, работающее на графическом процессоре в ближайшее время (и если это произойдет, это, вероятно, произойдет, потому что кто-то поставил перед собой именно эту цель, а не обязательно что-то приближающееся к оптимальному) соотношение затрат и выгод).
Реальность такова, что для многих (я испытываю желание сказать «большинство») типичный процессор гораздо более быстр, и удобство программирования (приводящее к таким вещам, как упрощенная разработка новых функций) гораздо важнее, чем Скорость исполнения.