// // cl2.hpp // XcodeOpenCL // // Created by Joshua Moerman on 28/03/14. // // #ifndef XcodeOpenCL_cl2_hpp #define XcodeOpenCL_cl2_hpp #include "cl.hpp" #include #include namespace cl { // debugging tool inline void checky(cl_int err){ assert(err == CL_SUCCESS); } } // simple variadic wrapper for kernels/arguments (1D) struct KernelOp{ KernelOp(const cl::Program& program, const char* name, cl_int* err = nullptr) : kernel(program, name, err) {} template cl_int operator()(cl::CommandQueue & queue, size_t W, Args&&... args){ return apply(queue, W, 0, std::forward(args)...); } private: cl::Kernel kernel; template cl_int apply(cl::CommandQueue & queue, size_t W, cl_uint n, T&& t, Args&&... args){ cl::checky(kernel.setArg(n, t)); return apply(queue, W, n+1, std::forward(args)...); } cl_int apply(cl::CommandQueue & queue, size_t W, size_t){ return queue.enqueueNDRangeKernel(kernel, cl::NullRange, cl::NDRange(W)); } }; // We need to put the op<<'s in namespace cl (ADL) namespace cl { inline std::ostream& operator<<(std::ostream& out, Platform const & platform){ return out << platform.getInfo() << ", " << platform.getInfo(); } inline std::ostream& operator<<(std::ostream& out, Device const & device){ out << device.getInfo() << ", " << device.getInfo() << ", " << device.getInfo(); return out; } inline std::ostream& operator<<(std::ostream& out, Context const & context){ Platform p; context.getInfo(CL_CONTEXT_PLATFORM, &p); out << "Platform:\t" << p << '\n'; auto devices = context.getInfo(); out << "Number of devices:\t" << devices.size() << '\n'; int i = 0; for(auto&& d : devices){ out << ++i << "\t" << d << '\n'; } return out; } inline std::ostream& operator<<(std::ostream& out, Program const & program){ return out << "Kernels in program:\t" << program.getInfo(); } inline std::ostream& operator<<(std::ostream& out, Image const & image){ out << "Image: " << image.getImageInfo() << "x" << image.getImageInfo(); return out << " elements: " << image.getImageInfo() << " pitch: " << image.getImageInfo(); } } #endif