I can figure your passion from your name “initram”. I think it is a linux internal data structure (initram_t), no? Vaguely remember so.
I used to work with linux long back. But now I am a big MS fan.
Coming to point,
The aim of OpenCL is to favour heterogeneous programming apart from portablity. If you read the OpenCL spec, you will understand this.
OpenCL spec says it has 3 layers.
Platform Layer - Helps discovery of devices, context creation
Runtime layer - to manipulate the context
Compiler - to compile OpenCL programs
The platform layer should be able to talk to various run-times to make true heterogeneous computing possible.
The platform layer should be vendor independent and one can either use it from NVIDIA or AMD. Its all going to do the same.
The runtime and compiler should be specific to the device (nvidia or amd).
However the API calls listed in the spec are for all types of devices.
The spec fails to say how platform layer will work with various runtime and compiler layer.
For example: consider this API call
clCreateCommandQueue(cl_context, cl_device_id, cl_command_queue_properties, cl_int *);
Now, this call will be implemented by both NVIDIA and AMD’s runtime. So, an application can be linked only with one of them. Grrrr…
That spoils the whole objective of heterogeneous computation.
I think one needs to write a higher-level API to make true heterogenous computing happen. And, that can be a nightmarish and un-wanted task.
To conclude – if what I have mentioned above is true, then I can only conclude that OpenCL has failed to attain the heterogeneous computing objective.