clover: Enable cl_khr_fp64 for devices that support doubles v4

v2:
  - Report correct values for CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE
    and CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE.
  - Only define cl_khr_fp64 if the extension is supported.
  - Remove trailing space from extension string.
  - Rename device query function from cl_khr_fp64() to
    has_doubles().

v3:
  - Return 0 for device::doubled_fp_confg() when doubles aren't
    supported.

v4:
  - Remove device query for double fp_config.

Reviewed-by: Francisco Jerez <currojerez@riseup.net>
This commit is contained in:
Tom Stellard 2014-07-02 15:42:43 -04:00
parent 8d8ca64c28
commit c97e902a1a
3 changed files with 25 additions and 3 deletions

View file

@ -145,7 +145,7 @@ clGetDeviceInfo(cl_device_id d_dev, cl_device_info param,
break;
case CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE:
buf.as_scalar<cl_uint>() = 2;
buf.as_scalar<cl_uint>() = dev.has_doubles() ? 2 : 0;
break;
case CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF:
@ -205,6 +205,21 @@ clGetDeviceInfo(cl_device_id d_dev, cl_device_info param,
CL_FP_DENORM | CL_FP_INF_NAN | CL_FP_ROUND_TO_NEAREST;
break;
case CL_DEVICE_DOUBLE_FP_CONFIG:
if (dev.has_doubles())
// This is the "mandated minimum double precision floating-point
// capability"
buf.as_scalar<cl_device_fp_config>() =
CL_FP_FMA
| CL_FP_ROUND_TO_NEAREST
| CL_FP_ROUND_TO_ZERO
| CL_FP_ROUND_TO_INF
| CL_FP_INF_NAN
| CL_FP_DENORM;
else
buf.as_scalar<cl_device_fp_config>() = 0;
break;
case CL_DEVICE_GLOBAL_MEM_CACHE_TYPE:
buf.as_scalar<cl_device_mem_cache_type>() = CL_NONE;
break;
@ -283,7 +298,7 @@ clGetDeviceInfo(cl_device_id d_dev, cl_device_info param,
break;
case CL_DEVICE_EXTENSIONS:
buf.as_string() = "";
buf.as_string() = dev.has_doubles() ? "cl_khr_fp64" : "";
break;
case CL_DEVICE_PLATFORM:
@ -315,7 +330,7 @@ clGetDeviceInfo(cl_device_id d_dev, cl_device_info param,
break;
case CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE:
buf.as_scalar<cl_uint>() = 2;
buf.as_scalar<cl_uint>() = dev.has_doubles() ? 2 : 0;
break;
case CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF:

View file

@ -173,6 +173,12 @@ device::image_support() const {
PIPE_COMPUTE_CAP_IMAGES_SUPPORTED)[0];
}
bool
device::has_doubles() const {
return pipe->get_shader_param(pipe, PIPE_SHADER_COMPUTE,
PIPE_SHADER_CAP_DOUBLES);
}
std::vector<size_t>
device::max_block_size() const {
auto v = get_compute_param<uint64_t>(pipe, PIPE_COMPUTE_CAP_MAX_BLOCK_SIZE);

View file

@ -64,6 +64,7 @@ namespace clover {
cl_uint max_clock_frequency() const;
cl_uint max_compute_units() const;
bool image_support() const;
bool has_doubles() const;
std::vector<size_t> max_block_size() const;
std::string device_name() const;