clover: Query maximum kernel block size from the device instead of the kernel object.

Based on a similar fix from Aaron Watry.  It seems unlikely that we
will ever need a kernel-specific setting for this, and the Gallium API
doesn't support it.  Remove kernel::max_block_size() altogether.
This commit is contained in:
Francisco Jerez 2013-10-24 12:09:55 -07:00
parent b8d7a97fad
commit 7463abd37d
4 changed files with 18 additions and 10 deletions

View file

@ -148,15 +148,14 @@ clGetKernelWorkGroupInfo(cl_kernel d_kern, cl_device_id d_dev,
size_t size, void *r_buf, size_t *r_size) try {
property_buffer buf { r_buf, size, r_size };
auto &kern = obj(d_kern);
auto pdev = pobj(d_dev);
auto &dev = (d_dev ? *pobj(d_dev) : unique(kern.prog.devices()));
if ((!pdev && kern.prog.devices().size() != 1) ||
(pdev && !count(*pdev, kern.prog.devices())))
if (!count(dev, kern.prog.devices()))
throw error(CL_INVALID_DEVICE);
switch (param) {
case CL_KERNEL_WORK_GROUP_SIZE:
buf.as_scalar<size_t>() = kern.max_block_size();
buf.as_scalar<size_t>() = dev.max_threads_per_block();
break;
case CL_KERNEL_COMPILE_WORK_GROUP_SIZE:
@ -183,6 +182,9 @@ clGetKernelWorkGroupInfo(cl_kernel d_kern, cl_device_id d_dev,
} catch (error &e) {
return e.get();
} catch (std::out_of_range &e) {
return CL_INVALID_DEVICE;
}
namespace {

View file

@ -120,11 +120,6 @@ kernel::mem_private() const {
return 0;
}
size_t
kernel::max_block_size() const {
return std::numeric_limits<std::size_t>::max();
}
const std::string &
kernel::name() const {
return _name;

View file

@ -119,7 +119,6 @@ namespace clover {
size_t mem_local() const;
size_t mem_private() const;
size_t max_block_size() const;
const std::string &name() const;
std::vector<size_t> block_size() const;

View file

@ -55,6 +55,18 @@ namespace clover {
return { std::forward<R>(r), 1, r.size() };
}
///
/// Return the only element in a range.
///
template<typename R>
detail::preferred_reference_type<R>
unique(R &&r) {
if (r.size() != 1)
throw std::out_of_range("");
return r.front();
}
///
/// Combine a variable number of ranges element-wise in a single
/// range of tuples.