32 #ifndef VSMC_OPENCL_CL_MANIP_HPP
33 #define VSMC_OPENCL_CL_MANIP_HPP
49 const ::cl::Kernel &kern, const ::cl::Device &dev,
50 std::size_t &factor, std::size_t &lmax, std::size_t &mmax)
53 kern.getWorkGroupInfo(dev,
54 CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE, &factor);
55 kern.getWorkGroupInfo(dev,
56 CL_KERNEL_WORK_GROUP_SIZE, &lmax);
57 if (factor == 0 || factor > lmax) {
58 factor = lmax = mmax = 0;
62 }
catch (const ::cl::Error &) {
63 factor = lmax = mmax = 0;
74 return (local_size && N % local_size) ?
75 (N / local_size + 1) * local_size : N;
83 const ::cl::Kernel &kern, const ::cl::Device &dev,
84 std::size_t &global_size, std::size_t &local_size)
86 cl::size_t<3> reqd_size;
88 kern.getWorkGroupInfo(dev,
89 CL_KERNEL_COMPILE_WORK_GROUP_SIZE, &reqd_size);
90 }
catch (const ::cl::Error &) {
94 if (reqd_size[0] != 0) {
95 local_size = reqd_size[0];
98 return global_size - N;
109 return global_size - N;
114 std::size_t diff_size = global_size - N;
115 for (std::size_t m = mmax; m >= 1; --m) {
116 std::size_t l = m * factor;
118 std::size_t d = g - N;
131 #if VSMC_HAS_CXX11_VARIADIC_TEMPLATES
132 template <
typename Arg1,
typename... Args>
143 const Arg1 &arg1,
const Args &... args)
145 kern.setArg(offset, arg1);
148 #else // VSMC_HAS_CXX11_VARIADIC_TEMPLATES
150 #endif // VSMC_HAS_CXX11_VARIADIC_TEMPLATES
154 #endif // VSMC_OPENCL_CL_MANIP_HPP
void cl_minmax_local_size(const ::cl::Kernel &kern, const ::cl::Device &dev, std::size_t &factor, std::size_t &lmax, std::size_t &mmax)
Query the preferred factor of local size.
std::size_t cl_min_global_size(std::size_t N, std::size_t local_size)
The minimum global size that is a multiple of the local size.
void cl_set_kernel_args(::cl::Kernel &,::cl_uint)
std::size_t cl_preferred_work_size(std::size_t N, const ::cl::Kernel &kern, const ::cl::Device &dev, std::size_t &global_size, std::size_t &local_size)
The preferred global and local size.