re-implemented opencl