Como você deve imaginar, arquiteturas de hardware de GPUs podem variar significativamente. Há diferentes fabricantes, e pode haver diferenças mesmo entre diferentes gerações de GPUs do mesmo fabricante. Além disso, os fabricantes de GPUs não liberam informações sobre os detalhes do hardware de seus produtos para o público. Uma das consequências é a necessidade de uso de drivers proprietários em Linux, se você quiser tomar vantagem completa de sua placa gráfica.
Felizmente um consórcio de indústrias liderado pelo Khronos Group desenvolveu uma interface aberta e padronizada chamada OpenCL. Ela permite o uso de sua GPU como dispositivo de processamento numérico. O OpenCL oferece uma linguagem parecida com C99 com forte foco em processamento paralelo. Uma aplicação que queria usar OpenCL precisará de código fonte OpenCL, que passará ao compilador OpenCL em tempo de execução. Desta forma a aplicação pode usar OpenCL em arquiteturas diferentes de GPU (inclusive ao mesmo tempo). Todos os “segredos” do hardware são escondidos nesse compilador e normalmente não são visíveis pelo usuário (ou pela aplicação). O código OpenCL compilado é carregado na sua GPU e - com certas chamadas a uma API - fica pronto para fazer cálculos para você.