Я опишу более теоретический ответ.
Различные параллельные аппаратные архитектуры реализуют разные модели вычислений.Трудно соединить их между собой.
В последовательном мире мы с радостью взломали одну и ту же модель вычислений: машину произвольного доступа.Это создает хороший общий язык между разработчиками аппаратного обеспечения и разработчиками программного обеспечения.
Такой единой оптимальной модели для параллельных вычислений не существует.С момента появления современных компьютеров было исследовано большое пространство дизайна;Текущие многоядерные процессоры и графические процессоры занимают лишь небольшую часть этого пространства.
Соединение этих моделей сложно, потому что параллельное программирование в основном связано с производительностью.Обычно вы заставляете что-то работать на двух разных моделях или системах, добавляя слой абстракции, чтобы скрыть детали.Однако редко, когда абстракция не сопровождается затратами на производительность.Это обычно приводит к тому, что у вас общий нижний знаменатель обеих моделей.
А теперь отвечаем на ваш реальный вопрос.Наличие вычислительной модели (язык, ОС, библиотека и т. Д.), Которая не зависит от ЦП или ГП, обычно не будет абстрагироваться от обоих, сохраняя при этом полную мощность, которую вы привыкли использовать с ЦП, из-за снижения производительности.Чтобы все было относительно эффективно, модель будет ориентироваться на графические процессоры, ограничивая свои возможности.
Серебряная подкладка:
То, что происходит, - это гибридные вычисления.Некоторые вычисления больше подходят для других типов архитектур.Вы также редко выполняете только один тип вычислений, так что «достаточно умный компилятор / среда выполнения» сможет различить, какая часть ваших вычислений должна выполняться на какой архитектуре.