Я думаю, вам нужно понять концепцию разделения работы между CPU и GPU. Если вы что-то кодируете и компилируете с помощью обычного компилятора, который не предназначен для выполнения на графическом процессоре, код всегда будет выполнять процессор.
Все вызовы функций OpenGL или DirectX в вашей основной программе выполняются на процессоре, нет «магического» слоя перевода. Однако некоторые из этих вызовов заставляют графический процессор делать что-то, например рисовать треугольники.
CUDA и OpenCL - языки, нацеленные на архитектуру параллельного выполнения данных. GPU - это такая архитектура. Но код CUDA и OpenCL требует некоторой хост-программы, которая, в свою очередь, будет выполняться на процессоре. То же самое касается программируемых шейдеров (HLSL, GLSL).
Итак: основная часть программы (настройка рабочей среды, выполнение вызовов рендеринга или выполнение с помощью графического процессора) будет работать на CPU. Код, работающий на GPU, скомпилирован в отдельном модуле компиляции (то есть код шейдера GLSL, загруженный в OpenGL, код OpenCL / CUDA, скомпилированный с помощью компилятора OpenCL / CUDA).