clover: Query maximum kernel block size from the device instead of the kernel object.
authorFrancisco Jerez <currojerez@riseup.net>
Thu, 24 Oct 2013 19:09:55 +0000 (12:09 -0700)
committerFrancisco Jerez <currojerez@riseup.net>
Thu, 24 Oct 2013 20:33:41 +0000 (13:33 -0700)
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.

src/gallium/state_trackers/clover/api/kernel.cpp
src/gallium/state_trackers/clover/core/kernel.cpp
src/gallium/state_trackers/clover/core/kernel.hpp
src/gallium/state_trackers/clover/util/algorithm.hpp

index d6129e63427335b96a56c67f1f0166a0f9a311e5..7fd23d2d8f48638b2262d2c92835039c05ab0a5a 100644 (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 {
index 3bd08f058af0a91943db64b257c41b294548fa58..4670046ef93205f568620ca0fbe83b2fa38c6970 100644 (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;
index 41d7b6f2c918c8acb27bd917f1ade18d59888f2f..4bcc3c7689104d2ca83bf4a838c8ef91874decad 100644 (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;
index 4eb90cffa9fd5160c78c1c1a96e779530fd7a785..1658458ee1854d8dddc602f70e84e8ea4e14b18d 100644 (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.