diff --git a/test_conformance/api/main.cpp b/test_conformance/api/main.cpp index 97dcc84d..b7255347 100644 --- a/test_conformance/api/main.cpp +++ b/test_conformance/api/main.cpp @@ -146,6 +146,8 @@ test_definition test_list[] = { ADD_TEST_VERSION(consistency_subgroups, Version(3, 0)), ADD_TEST_VERSION(consistency_prog_ctor_dtor, Version(3, 0)), ADD_TEST_VERSION(consistency_3d_image_writes, Version(3, 0)), + ADD_TEST(consistency_requirements_fp64), + ADD_TEST(consistency_requirements_fp16), ADD_TEST(min_image_formats), ADD_TEST(set_command_queue_property), diff --git a/test_conformance/api/procs.h b/test_conformance/api/procs.h index ee39c982..cad96efd 100644 --- a/test_conformance/api/procs.h +++ b/test_conformance/api/procs.h @@ -203,6 +203,14 @@ extern int test_consistency_3d_image_writes(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements); +extern int test_consistency_requirements_fp64(cl_device_id deviceID, + cl_context context, + cl_command_queue queue, + int num_elements); +extern int test_consistency_requirements_fp16(cl_device_id deviceID, + cl_context context, + cl_command_queue queue, + int num_elements); extern int test_min_image_formats(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements); diff --git a/test_conformance/api/test_api_consistency.cpp b/test_conformance/api/test_api_consistency.cpp index 56c83181..f12705ef 100644 --- a/test_conformance/api/test_api_consistency.cpp +++ b/test_conformance/api/test_api_consistency.cpp @@ -1151,3 +1151,148 @@ int test_consistency_3d_image_writes(cl_device_id deviceID, cl_context context, return TEST_PASS; } + +int test_consistency_requirements_fp64(cl_device_id deviceID, + cl_context context, + cl_command_queue queue, int num_elements) +{ + cl_int error = CL_SUCCESS; + cl_device_fp_config value = 0; + + if (is_extension_available(deviceID, "cl_khr_fp64")) + { + const Version version = get_device_cl_version(deviceID); + + error = clGetDeviceInfo(deviceID, CL_DEVICE_DOUBLE_FP_CONFIG, + sizeof(value), &value, nullptr); + test_error(error, "Unable to get device CL_DEVICE_DOUBLE_FP_CONFIG"); + test_assert_error( + value > 0, "CL_DEVICE_DOUBLE_FP_CONFIG must return nonzero value"); + if (version < Version(2, 0)) + { + test_assert_error( + value + & (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), + "Reported double fp config doesn't meet minimum set " + "for OpenCL 1.0, OpenCL 1.1, OpenCL 1.2 devices"); + } + else + { + test_assert_error( + value + & (CL_FP_FMA | CL_FP_ROUND_TO_NEAREST | CL_FP_INF_NAN + | CL_FP_DENORM), + "Reported double fp config doesn't meet minimum set " + "for OpenCL 2.0 or newer devices"); + } + + error = + clGetDeviceInfo(deviceID, CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE, + sizeof(value), &value, nullptr); + test_error( + error, + "Unable to get device CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE"); + test_assert_error(value > 0, + "CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE must return " + "nonzero value"); + + error = clGetDeviceInfo(deviceID, CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE, + sizeof(value), &value, nullptr); + test_error(error, + "Unable to get device CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE"); + test_assert_error( + value > 0, + "CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE must return nonzero value"); + } + else + { + error = clGetDeviceInfo(deviceID, CL_DEVICE_DOUBLE_FP_CONFIG, + sizeof(value), &value, nullptr); + test_error(error, "Unable to get device CL_DEVICE_DOUBLE_FP_CONFIG"); + test_assert_error(value == 0, + "CL_DEVICE_DOUBLE_FP_CONFIG must return 0"); + + error = + clGetDeviceInfo(deviceID, CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE, + sizeof(value), &value, nullptr); + test_error( + error, + "Unable to get device CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE"); + test_assert_error( + value == 0, + "CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE must return 0"); + + error = clGetDeviceInfo(deviceID, CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE, + sizeof(value), &value, nullptr); + test_error(error, + "Unable to get device CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE"); + test_assert_error(value == 0, + "CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE must return 0"); + } + + return TEST_PASS; +} + +int test_consistency_requirements_fp16(cl_device_id deviceID, + cl_context context, + cl_command_queue queue, int num_elements) +{ + cl_int error = CL_SUCCESS; + cl_device_fp_config value = 0; + + if (is_extension_available(deviceID, "cl_khr_fp16")) + { + error = clGetDeviceInfo(deviceID, CL_DEVICE_HALF_FP_CONFIG, + sizeof(value), &value, nullptr); + test_error(error, "Unable to get device CL_DEVICE_HALF_FP_CONFIG"); + test_assert_error(value > 0, + "CL_DEVICE_HALF_FP_CONFIG must return nonzero value"); + + test_assert_error((value & (CL_FP_ROUND_TO_NEAREST | CL_FP_INF_NAN)) + || (value & CL_FP_ROUND_TO_ZERO), + "Reported half fp config doesn't meet minimum set"); + + error = clGetDeviceInfo(deviceID, CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF, + sizeof(value), &value, nullptr); + test_error( + error, + "Unable to get device CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF"); + test_assert_error(value > 0, + "CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF must return " + "nonzero value"); + + error = clGetDeviceInfo(deviceID, CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF, + sizeof(value), &value, nullptr); + test_error(error, + "Unable to get device CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF"); + test_assert_error( + value > 0, + "CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF must return nonzero value"); + } + else + { + error = clGetDeviceInfo(deviceID, CL_DEVICE_HALF_FP_CONFIG, + sizeof(value), &value, nullptr); + test_error(error, "Unable to get device CL_DEVICE_HALF_FP_CONFIG"); + test_assert_error(value == 0, "CL_DEVICE_HALF_FP_CONFIG must return 0"); + + error = clGetDeviceInfo(deviceID, CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF, + sizeof(value), &value, nullptr); + test_error( + error, + "Unable to get device CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF"); + test_assert_error(value == 0, + "CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF must return " + "0"); + + error = clGetDeviceInfo(deviceID, CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF, + sizeof(value), &value, nullptr); + test_error(error, + "Unable to get device CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF"); + test_assert_error(value == 0, + "CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF must return 0"); + } + + return TEST_PASS; +}