mirror of
https://github.com/KhronosGroup/OpenCL-CTS.git
synced 2026-03-25 00:09:02 +00:00
make atomic tests in prog var testing optional (#1799)
This is helpful for testing progvars on implementations not implementing all the optional atomic features.
This commit is contained in:
@@ -48,6 +48,7 @@
|
|||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include "harness/typeWrappers.h"
|
#include "harness/typeWrappers.h"
|
||||||
#include "harness/errorHelpers.h"
|
#include "harness/errorHelpers.h"
|
||||||
|
#include "harness/featureHelpers.h"
|
||||||
#include "harness/mt19937.h"
|
#include "harness/mt19937.h"
|
||||||
#include "procs.h"
|
#include "procs.h"
|
||||||
|
|
||||||
@@ -57,6 +58,7 @@
|
|||||||
static int l_has_double = 0;
|
static int l_has_double = 0;
|
||||||
static int l_has_half = 0;
|
static int l_has_half = 0;
|
||||||
static int l_64bit_device = 0;
|
static int l_64bit_device = 0;
|
||||||
|
static int l_has_atomics = 1;
|
||||||
static int l_has_int64_atomics = 0;
|
static int l_has_int64_atomics = 0;
|
||||||
static int l_has_intptr_atomics = 0;
|
static int l_has_intptr_atomics = 0;
|
||||||
static int l_has_cles_int64 = 0;
|
static int l_has_cles_int64 = 0;
|
||||||
@@ -398,7 +400,7 @@ private:
|
|||||||
////////////////////
|
////////////////////
|
||||||
// File scope function declarations
|
// File scope function declarations
|
||||||
|
|
||||||
static void l_load_abilities(cl_device_id device);
|
static int l_load_abilities(cl_device_id device);
|
||||||
static const char* l_get_fp64_pragma(void);
|
static const char* l_get_fp64_pragma(void);
|
||||||
static const char* l_get_cles_int64_pragma(void);
|
static const char* l_get_cles_int64_pragma(void);
|
||||||
static int l_build_type_table(cl_device_id device);
|
static int l_build_type_table(cl_device_id device);
|
||||||
@@ -547,12 +549,26 @@ static cl_int print_build_log(cl_program program, cl_uint num_devices,
|
|||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void l_load_abilities(cl_device_id device)
|
static int l_load_abilities(cl_device_id device)
|
||||||
{
|
{
|
||||||
l_has_half = is_extension_available(device, "cl_khr_fp16");
|
l_has_half = is_extension_available(device, "cl_khr_fp16");
|
||||||
l_has_double = is_extension_available(device, "cl_khr_fp64");
|
l_has_double = is_extension_available(device, "cl_khr_fp64");
|
||||||
l_has_cles_int64 = is_extension_available(device, "cles_khr_int64");
|
l_has_cles_int64 = is_extension_available(device, "cles_khr_int64");
|
||||||
|
|
||||||
|
if (get_device_cl_version(device) >= Version(3, 0))
|
||||||
|
{
|
||||||
|
OpenCLCFeatures features;
|
||||||
|
int ret = get_device_cl_c_features(device, features);
|
||||||
|
if (ret)
|
||||||
|
{
|
||||||
|
log_error("Couldn't query OpenCL C features for the device!\n");
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
l_has_atomics = features.supports__opencl_c_atomic_order_seq_cst
|
||||||
|
&& features.supports__opencl_c_atomic_scope_device;
|
||||||
|
}
|
||||||
|
|
||||||
l_has_int64_atomics =
|
l_has_int64_atomics =
|
||||||
is_extension_available(device, "cl_khr_int64_base_atomics")
|
is_extension_available(device, "cl_khr_int64_base_atomics")
|
||||||
&& is_extension_available(device, "cl_khr_int64_extended_atomics");
|
&& is_extension_available(device, "cl_khr_int64_extended_atomics");
|
||||||
@@ -566,7 +582,8 @@ static void l_load_abilities(cl_device_id device)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 32-bit devices always have intptr atomics.
|
// 32-bit devices always have intptr atomics.
|
||||||
l_has_intptr_atomics = !l_64bit_device || l_has_int64_atomics;
|
l_has_intptr_atomics =
|
||||||
|
l_has_atomics && (!l_64bit_device || l_has_int64_atomics);
|
||||||
|
|
||||||
union {
|
union {
|
||||||
char c[4];
|
char c[4];
|
||||||
@@ -584,7 +601,7 @@ static void l_load_abilities(cl_device_id device)
|
|||||||
if (check_error(status,
|
if (check_error(status,
|
||||||
"clGetDeviceInfo for "
|
"clGetDeviceInfo for "
|
||||||
"CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS failed."))
|
"CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS failed."))
|
||||||
return;
|
return TEST_FAIL;
|
||||||
assert(max_dim > 0);
|
assert(max_dim > 0);
|
||||||
size_t max_id[3];
|
size_t max_id[3];
|
||||||
max_id[0] = 0;
|
max_id[0] = 0;
|
||||||
@@ -593,7 +610,7 @@ static void l_load_abilities(cl_device_id device)
|
|||||||
if (check_error(status,
|
if (check_error(status,
|
||||||
"clGetDeviceInfo for "
|
"clGetDeviceInfo for "
|
||||||
"CL_DEVICE_MAX_WORK_ITEM_SIZES failed."))
|
"CL_DEVICE_MAX_WORK_ITEM_SIZES failed."))
|
||||||
return;
|
return TEST_FAIL;
|
||||||
l_max_global_id0 = max_id[0];
|
l_max_global_id0 = max_id[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -606,8 +623,10 @@ static void l_load_abilities(cl_device_id device)
|
|||||||
if (check_error(status,
|
if (check_error(status,
|
||||||
"clGetDeviceInfo for "
|
"clGetDeviceInfo for "
|
||||||
"CL_DEVICE_LINKER_AVAILABLE failed."))
|
"CL_DEVICE_LINKER_AVAILABLE failed."))
|
||||||
return;
|
return TEST_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return TEST_PASS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -649,7 +668,9 @@ static int l_build_type_table(cl_device_id device)
|
|||||||
const char* intptr_atomics[] = { "atomic_intptr_t", "atomic_uintptr_t",
|
const char* intptr_atomics[] = { "atomic_intptr_t", "atomic_uintptr_t",
|
||||||
"atomic_size_t", "atomic_ptrdiff_t" };
|
"atomic_size_t", "atomic_ptrdiff_t" };
|
||||||
|
|
||||||
l_load_abilities(device);
|
int ret = l_load_abilities(device);
|
||||||
|
if (ret) return CL_INVALID_DEVICE;
|
||||||
|
|
||||||
num_type_info = 0;
|
num_type_info = 0;
|
||||||
|
|
||||||
// Boolean.
|
// Boolean.
|
||||||
@@ -688,6 +709,7 @@ static int l_build_type_table(cl_device_id device)
|
|||||||
// Atomic types.
|
// Atomic types.
|
||||||
for (iscalar = 0; iscalar < sizeof(atomics) / sizeof(atomics[0]); ++iscalar)
|
for (iscalar = 0; iscalar < sizeof(atomics) / sizeof(atomics[0]); ++iscalar)
|
||||||
{
|
{
|
||||||
|
if (!l_has_atomics) continue;
|
||||||
if (!l_has_int64_atomics && strstr(atomics[iscalar], "long")) continue;
|
if (!l_has_int64_atomics && strstr(atomics[iscalar], "long")) continue;
|
||||||
if (!(l_has_int64_atomics && l_has_double)
|
if (!(l_has_int64_atomics && l_has_double)
|
||||||
&& strstr(atomics[iscalar], "double"))
|
&& strstr(atomics[iscalar], "double"))
|
||||||
|
|||||||
Reference in New Issue
Block a user