// // cl2.hpp // XcodeOpenCL // // Created by Joshua Moerman on 28/03/14. // // #ifndef XcodeOpenCL_cl2_hpp #define XcodeOpenCL_cl2_hpp #include "cl.hpp" #include #include // debugging tool static void check(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) : kernel(program, name, err) {} template cl_int operator()(cl::CommandQueue & queue, size_t W, size_t H, Args&&... args){ return apply(queue, W, H, 0, std::forward(args)...); } private: cl::Kernel kernel; template cl_int apply(cl::CommandQueue & queue, size_t W, size_t H, cl_uint n, T&& t, Args&&... args){ check(kernel.setArg(n, t)); return apply(queue, W, H, n+1, std::forward(args)...); } cl_int apply(cl::CommandQueue & queue, size_t W, size_t H, size_t){ return queue.enqueueNDRangeKernel(kernel, cl::NullRange, cl::NDRange(W, H), cl::NullRange); } }; // We need to put the op<<'s in namespace cl (ADL) namespace cl { std::ostream& operator<<(std::ostream& out, Platform const & platform){ return out << platform.getInfo() << ", " << platform.getInfo(); } std::ostream& operator<<(std::ostream& out, Device const & device){ out << device.getInfo() << ", " << device.getInfo() << ", " << device.getInfo(); return out; } 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; } std::ostream& operator<<(std::ostream& out, Program const & program){ return out << "Kernels in program:\t" << program.getInfo(); } } #endif