xref: /aosp_15_r20/external/OpenCL-CTS/test_conformance/SVM/common.h (revision 6467f958c7de8070b317fc65bcb0f6472e388d82)
1*6467f958SSadaf Ebrahimi //
2*6467f958SSadaf Ebrahimi // Copyright (c) 2017 The Khronos Group Inc.
3*6467f958SSadaf Ebrahimi //
4*6467f958SSadaf Ebrahimi // Licensed under the Apache License, Version 2.0 (the "License");
5*6467f958SSadaf Ebrahimi // you may not use this file except in compliance with the License.
6*6467f958SSadaf Ebrahimi // You may obtain a copy of the License at
7*6467f958SSadaf Ebrahimi //
8*6467f958SSadaf Ebrahimi //    http://www.apache.org/licenses/LICENSE-2.0
9*6467f958SSadaf Ebrahimi //
10*6467f958SSadaf Ebrahimi // Unless required by applicable law or agreed to in writing, software
11*6467f958SSadaf Ebrahimi // distributed under the License is distributed on an "AS IS" BASIS,
12*6467f958SSadaf Ebrahimi // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*6467f958SSadaf Ebrahimi // See the License for the specific language governing permissions and
14*6467f958SSadaf Ebrahimi // limitations under the License.
15*6467f958SSadaf Ebrahimi //
16*6467f958SSadaf Ebrahimi #ifndef __COMMON_H__
17*6467f958SSadaf Ebrahimi #define __COMMON_H__
18*6467f958SSadaf Ebrahimi 
19*6467f958SSadaf Ebrahimi #include "harness/compat.h"
20*6467f958SSadaf Ebrahimi #include "harness/testHarness.h"
21*6467f958SSadaf Ebrahimi #include "harness/errorHelpers.h"
22*6467f958SSadaf Ebrahimi #include "harness/kernelHelpers.h"
23*6467f958SSadaf Ebrahimi #include "harness/typeWrappers.h"
24*6467f958SSadaf Ebrahimi #include <vector>
25*6467f958SSadaf Ebrahimi #include <string>
26*6467f958SSadaf Ebrahimi 
27*6467f958SSadaf Ebrahimi #if (defined(_WIN32) || defined(_WIN64)) && defined(_MSC_VER)
28*6467f958SSadaf Ebrahimi     #include <windows.h>
29*6467f958SSadaf Ebrahimi #endif
30*6467f958SSadaf Ebrahimi 
31*6467f958SSadaf Ebrahimi typedef enum {
32*6467f958SSadaf Ebrahimi     memory_order_relaxed,
33*6467f958SSadaf Ebrahimi     memory_order_acquire,
34*6467f958SSadaf Ebrahimi     memory_order_release,
35*6467f958SSadaf Ebrahimi     memory_order_acq_rel,
36*6467f958SSadaf Ebrahimi     memory_order_seq_cst
37*6467f958SSadaf Ebrahimi } cl_memory_order;
38*6467f958SSadaf Ebrahimi 
39*6467f958SSadaf Ebrahimi cl_int AtomicLoadExplicit(volatile cl_int * pValue, cl_memory_order order);
40*6467f958SSadaf Ebrahimi cl_int AtomicFetchAddExplicit(volatile cl_int *object, cl_int operand, cl_memory_order o);
41*6467f958SSadaf Ebrahimi 
42*6467f958SSadaf Ebrahimi template <typename T>
AtomicCompareExchangeStrongExplicit(volatile T * a,T * expected,T desired,cl_memory_order order_success,cl_memory_order order_failure)43*6467f958SSadaf Ebrahimi bool AtomicCompareExchangeStrongExplicit(volatile T *a, T *expected, T desired,
44*6467f958SSadaf Ebrahimi                                   cl_memory_order order_success,
45*6467f958SSadaf Ebrahimi                                   cl_memory_order order_failure)
46*6467f958SSadaf Ebrahimi {
47*6467f958SSadaf Ebrahimi     T tmp;
48*6467f958SSadaf Ebrahimi #if defined( _MSC_VER ) || (defined( __INTEL_COMPILER ) && defined(WIN32))
49*6467f958SSadaf Ebrahimi     tmp = (sizeof(void*) == 8) ? (T)InterlockedCompareExchange64((volatile LONG64 *)a, (LONG64)desired, *(LONG64 *)expected) :
50*6467f958SSadaf Ebrahimi       (T)InterlockedCompareExchange((volatile LONG*)a, (LONG)desired, *(LONG*)expected);
51*6467f958SSadaf Ebrahimi #elif defined(__GNUC__)
52*6467f958SSadaf Ebrahimi     tmp = (T)__sync_val_compare_and_swap((volatile intptr_t*)a, (intptr_t)(*expected), (intptr_t)desired);
53*6467f958SSadaf Ebrahimi #else
54*6467f958SSadaf Ebrahimi     log_info("Host function not implemented: atomic_compare_exchange\n");
55*6467f958SSadaf Ebrahimi     tmp = 0;
56*6467f958SSadaf Ebrahimi #endif
57*6467f958SSadaf Ebrahimi     if(tmp == *expected)
58*6467f958SSadaf Ebrahimi         return true;
59*6467f958SSadaf Ebrahimi     *expected = tmp;
60*6467f958SSadaf Ebrahimi     return false;
61*6467f958SSadaf Ebrahimi }
62*6467f958SSadaf Ebrahimi 
63*6467f958SSadaf Ebrahimi // this checks for a NULL ptr and/or an error code
64*6467f958SSadaf Ebrahimi #define test_error2(error_code, ptr, msg)  { if(error != 0)  { test_error(error_code, msg); } else  { if(NULL == ptr)  {print_null_error(msg); return -1;} } }
65*6467f958SSadaf Ebrahimi #define print_null_error(msg) log_error("ERROR: %s! (NULL pointer detected %s:%d)\n", msg, __FILE__, __LINE__ );
66*6467f958SSadaf Ebrahimi 
67*6467f958SSadaf Ebrahimi // max possible number of queues needed, 1 for each device in platform.
68*6467f958SSadaf Ebrahimi #define MAXQ 32
69*6467f958SSadaf Ebrahimi 
70*6467f958SSadaf Ebrahimi typedef struct Node{
71*6467f958SSadaf Ebrahimi     cl_int global_id;
72*6467f958SSadaf Ebrahimi     cl_int position_in_list;
73*6467f958SSadaf Ebrahimi     struct Node* pNext;
74*6467f958SSadaf Ebrahimi } Node;
75*6467f958SSadaf Ebrahimi 
76*6467f958SSadaf Ebrahimi extern void   create_linked_lists(Node* pNodes, size_t num_lists, int list_length);
77*6467f958SSadaf Ebrahimi extern cl_int verify_linked_lists(Node* pNodes, size_t num_lists, int list_length);
78*6467f958SSadaf Ebrahimi 
79*6467f958SSadaf Ebrahimi extern cl_int        create_linked_lists_on_device(int qi, cl_command_queue q, cl_mem allocator,     cl_kernel k, size_t numLists  );
80*6467f958SSadaf Ebrahimi extern cl_int        verify_linked_lists_on_device(int qi, cl_command_queue q, cl_mem num_correct,   cl_kernel k, cl_int ListLength, size_t numLists  );
81*6467f958SSadaf Ebrahimi extern cl_int create_linked_lists_on_device_no_map(int qi, cl_command_queue q, size_t *pAllocator,   cl_kernel k, size_t numLists  );
82*6467f958SSadaf Ebrahimi extern cl_int verify_linked_lists_on_device_no_map(int qi, cl_command_queue q, cl_int *pNum_correct, cl_kernel k, cl_int ListLength, size_t numLists  );
83*6467f958SSadaf Ebrahimi 
84*6467f958SSadaf Ebrahimi extern int    test_svm_byte_granularity(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
85*6467f958SSadaf Ebrahimi extern int    test_svm_set_kernel_exec_info_svm_ptrs(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
86*6467f958SSadaf Ebrahimi extern int    test_svm_fine_grain_memory_consistency(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
87*6467f958SSadaf Ebrahimi extern int    test_svm_fine_grain_sync_buffers(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
88*6467f958SSadaf Ebrahimi extern int    test_svm_shared_address_space_coarse_grain_old_api(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
89*6467f958SSadaf Ebrahimi extern int    test_svm_shared_address_space_coarse_grain_new_api(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
90*6467f958SSadaf Ebrahimi extern int    test_svm_shared_address_space_fine_grain_buffers(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
91*6467f958SSadaf Ebrahimi extern int    test_svm_shared_address_space_fine_grain(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
92*6467f958SSadaf Ebrahimi extern int    test_svm_cross_buffer_pointers_coarse_grain(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
93*6467f958SSadaf Ebrahimi extern int    test_svm_pointer_passing(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
94*6467f958SSadaf Ebrahimi extern int    test_svm_allocate_shared_buffer(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
95*6467f958SSadaf Ebrahimi extern int    test_svm_shared_sub_buffers(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
96*6467f958SSadaf Ebrahimi extern int    test_svm_enqueue_api(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
97*6467f958SSadaf Ebrahimi extern int    test_svm_migrate(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
98*6467f958SSadaf Ebrahimi 
99*6467f958SSadaf Ebrahimi extern cl_int create_cl_objects(cl_device_id device_from_harness, const char** ppCodeString, cl_context* context, cl_program *program, cl_command_queue *queues, cl_uint *num_devices, cl_device_svm_capabilities required_svm_caps, std::vector<std::string> extensions_list = std::vector<std::string>());
100*6467f958SSadaf Ebrahimi 
101*6467f958SSadaf Ebrahimi extern const char *linked_list_create_and_verify_kernels[];
102*6467f958SSadaf Ebrahimi 
103*6467f958SSadaf Ebrahimi #endif    // #ifndef __COMMON_H__
104*6467f958SSadaf Ebrahimi 
105