"From reading the spec, I think __constant => __global + CL_MEM_READ_ONLY."
In fact, when you specify _constant instead of __global, you tell your device to save this data in another part of the memory. In some devices, it is true that it can be the same, but it cannot be others. For example, on NVIDIA cards you only have 64kb of read-only memory and mb downloads for __global. The advantage of __constants is that it is cached on NVIDIA devices :)
You can request your device: (example of my request for a device)
CL_DEVICE_MAX_MEM_ALLOC_SIZE: 128 MB
CL_DEVICE_GLOBAL_MEM_SIZE: 255 MB
CL_DEVICE_LOCAL_MEM_SIZE: 16 KB
CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE: 64 KB
Vando source share