The OpenCL system for open heterogenous data parallel supercomputing. **General Notes on the differences between Haskell and the OpenCL-C implementation** * Side-effectful procedures capable of returning an error code only return a Maybe ErrorCode, with Nothing returned upon success * Procedures which follow the pattern of returning a pointer to an object and taking a final parameter as an error code instead return Either ErrorCode ObjectType * Procedures which prefix with clGetInfo* merely take the object, parameter name, and parameter size to allocate. The allocation handled by OpenCLRaw and returned as a Haskell-managed ForeignPtr () * Enumerations and constants are replaced by newtypes for the sake of type-safety.