• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright (c) 2017 The Khronos Group Inc.
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 //    http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 //
16 #include "harness/testHarness.h"
17 #include <iostream>
18 #include <string>
19 
20 bool gHost = false; // flag for testing native host threads (test verification)
21 bool gOldAPI = false; // flag for testing with old API (OpenCL 1.2) - test verification
22 bool gContinueOnError = false; // execute all cases even when errors detected
23 bool gNoGlobalVariables = false; // disable cases with global atomics in program scope
24 bool gNoGenericAddressSpace = false; // disable cases with generic address space
25 bool gUseHostPtr = false; // use malloc/free with CL_MEM_USE_HOST_PTR instead of clSVMAlloc/clSVMFree
26 bool gDebug = false; // always print OpenCL kernel code
27 int gInternalIterations = 10000; // internal test iterations for atomic operation, sufficient to verify atomicity
28 int gMaxDeviceThreads = 1024; // maximum number of threads executed on OCL device
29 
30 extern int test_atomic_init(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
31 extern int test_atomic_store(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
32 extern int test_atomic_load(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
33 extern int test_atomic_store_load(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
34 extern int test_atomic_exchange(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
35 extern int test_atomic_compare_exchange_weak(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
36 extern int test_atomic_compare_exchange_strong(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
37 extern int test_atomic_fetch_add(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
38 extern int test_atomic_fetch_sub(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
39 extern int test_atomic_fetch_and(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
40 extern int test_atomic_fetch_or(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
41 extern int test_atomic_fetch_orand(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
42 extern int test_atomic_fetch_xor(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
43 extern int test_atomic_fetch_xor2(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
44 extern int test_atomic_fetch_min(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
45 extern int test_atomic_fetch_max(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
46 extern int test_atomic_flag(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
47 extern int test_atomic_fence(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
48 
49 extern int test_svm_atomic_init(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
50 extern int test_svm_atomic_store(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
51 extern int test_svm_atomic_load(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
52 extern int test_svm_atomic_store_load(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
53 extern int test_svm_atomic_exchange(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
54 extern int test_svm_atomic_compare_exchange_weak(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
55 extern int test_svm_atomic_compare_exchange_strong(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
56 extern int test_svm_atomic_fetch_add(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
57 extern int test_svm_atomic_fetch_sub(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
58 extern int test_svm_atomic_fetch_and(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
59 extern int test_svm_atomic_fetch_or(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
60 extern int test_svm_atomic_fetch_orand(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
61 extern int test_svm_atomic_fetch_xor(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
62 extern int test_svm_atomic_fetch_xor2(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
63 extern int test_svm_atomic_fetch_min(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
64 extern int test_svm_atomic_fetch_max(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
65 extern int test_svm_atomic_flag(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
66 extern int test_svm_atomic_fence(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
67 
68 test_definition test_list[] = {
69     ADD_TEST( atomic_init ),
70     ADD_TEST( atomic_store ),
71     ADD_TEST( atomic_load ),
72     ADD_TEST( atomic_exchange ),
73     ADD_TEST( atomic_compare_exchange_weak ),
74     ADD_TEST( atomic_compare_exchange_strong ),
75     ADD_TEST( atomic_fetch_add ),
76     ADD_TEST( atomic_fetch_sub ),
77     ADD_TEST( atomic_fetch_and ),
78     ADD_TEST( atomic_fetch_or ),
79     ADD_TEST( atomic_fetch_orand ),
80     ADD_TEST( atomic_fetch_xor ),
81     ADD_TEST( atomic_fetch_xor2 ),
82     ADD_TEST( atomic_fetch_min ),
83     ADD_TEST( atomic_fetch_max ),
84     ADD_TEST( atomic_flag ),
85     ADD_TEST( atomic_fence ),
86 
87     ADD_TEST( svm_atomic_init ),
88     ADD_TEST( svm_atomic_store ),
89     ADD_TEST( svm_atomic_load ),
90     ADD_TEST( svm_atomic_exchange ),
91     ADD_TEST( svm_atomic_compare_exchange_weak ),
92     ADD_TEST( svm_atomic_compare_exchange_strong ),
93     ADD_TEST( svm_atomic_fetch_add ),
94     ADD_TEST( svm_atomic_fetch_sub ),
95     ADD_TEST( svm_atomic_fetch_and ),
96     ADD_TEST( svm_atomic_fetch_or ),
97     ADD_TEST( svm_atomic_fetch_orand ),
98     ADD_TEST( svm_atomic_fetch_xor ),
99     ADD_TEST( svm_atomic_fetch_xor2 ),
100     ADD_TEST( svm_atomic_fetch_min ),
101     ADD_TEST( svm_atomic_fetch_max ),
102     ADD_TEST( svm_atomic_flag ),
103     ADD_TEST( svm_atomic_fence ),
104 };
105 
106 const int test_num = ARRAY_SIZE( test_list );
107 
InitCL(cl_device_id device)108 test_status InitCL(cl_device_id device) {
109     auto version = get_device_cl_version(device);
110     auto expected_min_version = Version(2, 0);
111     if (version < expected_min_version)
112     {
113         version_expected_info("Test", expected_min_version.to_string().c_str(), version.to_string().c_str());
114         return TEST_SKIP;
115     }
116     return TEST_PASS;
117 }
118 
main(int argc,const char * argv[])119 int main(int argc, const char *argv[])
120 {
121   bool noCert = false;
122   while(true)
123   {
124     if(std::string(argv[argc-1]) == "-h")
125     {
126       log_info("Test options:\n");
127       log_info("  '-host'                    flag for testing native host threads (test verification)\n");
128       log_info("  '-oldAPI'                  flag for testing with old API (OpenCL 1.2) - test verification\n");
129       log_info("  '-continueOnError'         execute all cases even when errors detected\n");
130       log_info("  '-noGlobalVariables'       disable cases with global atomics in program scope\n");
131       log_info("  '-noGenericAddressSpace'   disable cases with generic address space\n");
132       log_info("  '-useHostPtr'              use malloc/free with CL_MEM_USE_HOST_PTR instead of clSVMAlloc/clSVMFree\n");
133       log_info("  '-debug'                   always print OpenCL kernel code\n");
134       log_info("  '-internalIterations <X>'  internal test iterations for atomic operation, sufficient to verify atomicity\n");
135       log_info("  '-maxDeviceThreads <X>'    maximum number of threads executed on OCL device");
136 
137       break;
138     }
139     if(std::string(argv[argc-1]) == "-host") // temporary option for testing native host threads
140     {
141       gHost = true;
142       noCert = true;
143     }
144     else if(std::string(argv[argc-1]) == "-oldAPI") // temporary flag for testing with old API (OpenCL 1.2)
145     {
146       gOldAPI = true;
147       gNoGlobalVariables = true;
148       gNoGenericAddressSpace = true;
149       gUseHostPtr = true;
150       noCert = true;
151     }
152     else if(std::string(argv[argc-1]) == "-continueOnError") // execute all cases even when errors detected
153       gContinueOnError = true;
154     else if(std::string(argv[argc-1]) == "-noGlobalVariables") // disable cases with global atomics in program scope
155     {
156       gNoGlobalVariables = true;
157       noCert = true;
158     }
159     else if(std::string(argv[argc-1]) == "-noGenericAddressSpace") // disable cases with generic address space
160     {
161       gNoGenericAddressSpace = true;
162       noCert = true;
163     }
164     else if(std::string(argv[argc-1]) == "-useHostPtr") // use malloc/free with CL_MEM_USE_HOST_PTR instead of clSVMAlloc/clSVMFree
165     {
166       gUseHostPtr = true;
167       noCert = true;
168     }
169     else if(std::string(argv[argc-1]) == "-debug") // print OpenCL kernel code
170       gDebug = true;
171     else if(argc > 2 && std::string(argv[argc-2]) == "-internalIterations") // internal test iterations for atomic operation, sufficient to verify atomicity
172     {
173       gInternalIterations = atoi(argv[argc-1]);
174       if(gInternalIterations < 1)
175       {
176         log_info("Invalid value: Number of internal iterations (%d) must be > 0\n", gInternalIterations);
177         return -1;
178       }
179       argc--;
180       noCert = true;
181     }
182     else if(argc > 2 && std::string(argv[argc-2]) == "-maxDeviceThreads") // maximum number of threads executed on OCL device
183     {
184       gMaxDeviceThreads = atoi(argv[argc-1]);
185       argc--;
186       noCert = true;
187     }
188     else
189       break;
190     argc--;
191   }
192   if(noCert)
193   {
194     log_info("\n" );
195     log_info("***                                                                        ***\n");
196     log_info("*** WARNING: Test execution in debug mode (forced by command-line option)! ***\n");
197     log_info("*** Use of this mode is not sufficient to verify correctness.              ***\n");
198     log_info("***                                                                        ***\n");
199   }
200   return runTestHarnessWithCheck(argc, argv, test_num, test_list, false, false, InitCL);
201 }
202