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 #include "compat.h"
17*6467f958SSadaf Ebrahimi #include <stdio.h>
18*6467f958SSadaf Ebrahimi #include <stdlib.h>
19*6467f958SSadaf Ebrahimi #include <string.h>
20*6467f958SSadaf Ebrahimi
21*6467f958SSadaf Ebrahimi #include <algorithm>
22*6467f958SSadaf Ebrahimi
23*6467f958SSadaf Ebrahimi #include "errorHelpers.h"
24*6467f958SSadaf Ebrahimi
25*6467f958SSadaf Ebrahimi #include "parseParameters.h"
26*6467f958SSadaf Ebrahimi #include "testHarness.h"
27*6467f958SSadaf Ebrahimi
28*6467f958SSadaf Ebrahimi #include <CL/cl_half.h>
29*6467f958SSadaf Ebrahimi
IGetErrorString(int clErrorCode)30*6467f958SSadaf Ebrahimi const char *IGetErrorString(int clErrorCode)
31*6467f958SSadaf Ebrahimi {
32*6467f958SSadaf Ebrahimi switch (clErrorCode)
33*6467f958SSadaf Ebrahimi {
34*6467f958SSadaf Ebrahimi case CL_SUCCESS: return "CL_SUCCESS";
35*6467f958SSadaf Ebrahimi case CL_DEVICE_NOT_FOUND: return "CL_DEVICE_NOT_FOUND";
36*6467f958SSadaf Ebrahimi case CL_DEVICE_NOT_AVAILABLE: return "CL_DEVICE_NOT_AVAILABLE";
37*6467f958SSadaf Ebrahimi case CL_COMPILER_NOT_AVAILABLE: return "CL_COMPILER_NOT_AVAILABLE";
38*6467f958SSadaf Ebrahimi case CL_MEM_OBJECT_ALLOCATION_FAILURE:
39*6467f958SSadaf Ebrahimi return "CL_MEM_OBJECT_ALLOCATION_FAILURE";
40*6467f958SSadaf Ebrahimi case CL_OUT_OF_RESOURCES: return "CL_OUT_OF_RESOURCES";
41*6467f958SSadaf Ebrahimi case CL_OUT_OF_HOST_MEMORY: return "CL_OUT_OF_HOST_MEMORY";
42*6467f958SSadaf Ebrahimi case CL_PROFILING_INFO_NOT_AVAILABLE:
43*6467f958SSadaf Ebrahimi return "CL_PROFILING_INFO_NOT_AVAILABLE";
44*6467f958SSadaf Ebrahimi case CL_MEM_COPY_OVERLAP: return "CL_MEM_COPY_OVERLAP";
45*6467f958SSadaf Ebrahimi case CL_IMAGE_FORMAT_MISMATCH: return "CL_IMAGE_FORMAT_MISMATCH";
46*6467f958SSadaf Ebrahimi case CL_IMAGE_FORMAT_NOT_SUPPORTED:
47*6467f958SSadaf Ebrahimi return "CL_IMAGE_FORMAT_NOT_SUPPORTED";
48*6467f958SSadaf Ebrahimi case CL_BUILD_PROGRAM_FAILURE: return "CL_BUILD_PROGRAM_FAILURE";
49*6467f958SSadaf Ebrahimi case CL_MAP_FAILURE: return "CL_MAP_FAILURE";
50*6467f958SSadaf Ebrahimi case CL_MISALIGNED_SUB_BUFFER_OFFSET:
51*6467f958SSadaf Ebrahimi return "CL_MISALIGNED_SUB_BUFFER_OFFSET";
52*6467f958SSadaf Ebrahimi case CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST:
53*6467f958SSadaf Ebrahimi return "CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST";
54*6467f958SSadaf Ebrahimi case CL_COMPILE_PROGRAM_FAILURE: return "CL_COMPILE_PROGRAM_FAILURE";
55*6467f958SSadaf Ebrahimi case CL_LINKER_NOT_AVAILABLE: return "CL_LINKER_NOT_AVAILABLE";
56*6467f958SSadaf Ebrahimi case CL_LINK_PROGRAM_FAILURE: return "CL_LINK_PROGRAM_FAILURE";
57*6467f958SSadaf Ebrahimi case CL_DEVICE_PARTITION_FAILED: return "CL_DEVICE_PARTITION_FAILED";
58*6467f958SSadaf Ebrahimi case CL_KERNEL_ARG_INFO_NOT_AVAILABLE:
59*6467f958SSadaf Ebrahimi return "CL_KERNEL_ARG_INFO_NOT_AVAILABLE";
60*6467f958SSadaf Ebrahimi case CL_INVALID_VALUE: return "CL_INVALID_VALUE";
61*6467f958SSadaf Ebrahimi case CL_INVALID_DEVICE_TYPE: return "CL_INVALID_DEVICE_TYPE";
62*6467f958SSadaf Ebrahimi case CL_INVALID_DEVICE: return "CL_INVALID_DEVICE";
63*6467f958SSadaf Ebrahimi case CL_INVALID_CONTEXT: return "CL_INVALID_CONTEXT";
64*6467f958SSadaf Ebrahimi case CL_INVALID_QUEUE_PROPERTIES: return "CL_INVALID_QUEUE_PROPERTIES";
65*6467f958SSadaf Ebrahimi case CL_INVALID_COMMAND_QUEUE: return "CL_INVALID_COMMAND_QUEUE";
66*6467f958SSadaf Ebrahimi case CL_INVALID_HOST_PTR: return "CL_INVALID_HOST_PTR";
67*6467f958SSadaf Ebrahimi case CL_INVALID_MEM_OBJECT: return "CL_INVALID_MEM_OBJECT";
68*6467f958SSadaf Ebrahimi case CL_INVALID_IMAGE_FORMAT_DESCRIPTOR:
69*6467f958SSadaf Ebrahimi return "CL_INVALID_IMAGE_FORMAT_DESCRIPTOR";
70*6467f958SSadaf Ebrahimi case CL_INVALID_IMAGE_SIZE: return "CL_INVALID_IMAGE_SIZE";
71*6467f958SSadaf Ebrahimi case CL_INVALID_SAMPLER: return "CL_INVALID_SAMPLER";
72*6467f958SSadaf Ebrahimi case CL_INVALID_BINARY: return "CL_INVALID_BINARY";
73*6467f958SSadaf Ebrahimi case CL_INVALID_BUILD_OPTIONS: return "CL_INVALID_BUILD_OPTIONS";
74*6467f958SSadaf Ebrahimi case CL_INVALID_PLATFORM: return "CL_INVALID_PLATFORM";
75*6467f958SSadaf Ebrahimi case CL_INVALID_PROGRAM: return "CL_INVALID_PROGRAM";
76*6467f958SSadaf Ebrahimi case CL_INVALID_PROGRAM_EXECUTABLE:
77*6467f958SSadaf Ebrahimi return "CL_INVALID_PROGRAM_EXECUTABLE";
78*6467f958SSadaf Ebrahimi case CL_INVALID_KERNEL_NAME: return "CL_INVALID_KERNEL_NAME";
79*6467f958SSadaf Ebrahimi case CL_INVALID_KERNEL_DEFINITION:
80*6467f958SSadaf Ebrahimi return "CL_INVALID_KERNEL_DEFINITION";
81*6467f958SSadaf Ebrahimi case CL_INVALID_KERNEL: return "CL_INVALID_KERNEL";
82*6467f958SSadaf Ebrahimi case CL_INVALID_ARG_INDEX: return "CL_INVALID_ARG_INDEX";
83*6467f958SSadaf Ebrahimi case CL_INVALID_ARG_VALUE: return "CL_INVALID_ARG_VALUE";
84*6467f958SSadaf Ebrahimi case CL_INVALID_ARG_SIZE: return "CL_INVALID_ARG_SIZE";
85*6467f958SSadaf Ebrahimi case CL_INVALID_KERNEL_ARGS: return "CL_INVALID_KERNEL_ARGS";
86*6467f958SSadaf Ebrahimi case CL_INVALID_WORK_DIMENSION: return "CL_INVALID_WORK_DIMENSION";
87*6467f958SSadaf Ebrahimi case CL_INVALID_WORK_GROUP_SIZE: return "CL_INVALID_WORK_GROUP_SIZE";
88*6467f958SSadaf Ebrahimi case CL_INVALID_WORK_ITEM_SIZE: return "CL_INVALID_WORK_ITEM_SIZE";
89*6467f958SSadaf Ebrahimi case CL_INVALID_GLOBAL_OFFSET: return "CL_INVALID_GLOBAL_OFFSET";
90*6467f958SSadaf Ebrahimi case CL_INVALID_EVENT_WAIT_LIST: return "CL_INVALID_EVENT_WAIT_LIST";
91*6467f958SSadaf Ebrahimi case CL_INVALID_EVENT: return "CL_INVALID_EVENT";
92*6467f958SSadaf Ebrahimi case CL_INVALID_OPERATION: return "CL_INVALID_OPERATION";
93*6467f958SSadaf Ebrahimi case CL_INVALID_GL_OBJECT: return "CL_INVALID_GL_OBJECT";
94*6467f958SSadaf Ebrahimi case CL_INVALID_BUFFER_SIZE: return "CL_INVALID_BUFFER_SIZE";
95*6467f958SSadaf Ebrahimi case CL_INVALID_MIP_LEVEL: return "CL_INVALID_MIP_LEVEL";
96*6467f958SSadaf Ebrahimi case CL_INVALID_GLOBAL_WORK_SIZE: return "CL_INVALID_GLOBAL_WORK_SIZE";
97*6467f958SSadaf Ebrahimi case CL_INVALID_PROPERTY: return "CL_INVALID_PROPERTY";
98*6467f958SSadaf Ebrahimi case CL_INVALID_IMAGE_DESCRIPTOR: return "CL_INVALID_IMAGE_DESCRIPTOR";
99*6467f958SSadaf Ebrahimi case CL_INVALID_COMPILER_OPTIONS: return "CL_INVALID_COMPILER_OPTIONS";
100*6467f958SSadaf Ebrahimi case CL_INVALID_LINKER_OPTIONS: return "CL_INVALID_LINKER_OPTIONS";
101*6467f958SSadaf Ebrahimi case CL_INVALID_DEVICE_PARTITION_COUNT:
102*6467f958SSadaf Ebrahimi return "CL_INVALID_DEVICE_PARTITION_COUNT";
103*6467f958SSadaf Ebrahimi case CL_INVALID_PIPE_SIZE: return "CL_INVALID_PIPE_SIZE";
104*6467f958SSadaf Ebrahimi case CL_INVALID_DEVICE_QUEUE: return "CL_INVALID_DEVICE_QUEUE";
105*6467f958SSadaf Ebrahimi case CL_INVALID_SPEC_ID: return "CL_INVALID_SPEC_ID";
106*6467f958SSadaf Ebrahimi case CL_MAX_SIZE_RESTRICTION_EXCEEDED:
107*6467f958SSadaf Ebrahimi return "CL_MAX_SIZE_RESTRICTION_EXCEEDED";
108*6467f958SSadaf Ebrahimi default: return "(unknown)";
109*6467f958SSadaf Ebrahimi }
110*6467f958SSadaf Ebrahimi }
111*6467f958SSadaf Ebrahimi
GetChannelOrderName(cl_channel_order order)112*6467f958SSadaf Ebrahimi const char *GetChannelOrderName(cl_channel_order order)
113*6467f958SSadaf Ebrahimi {
114*6467f958SSadaf Ebrahimi switch (order)
115*6467f958SSadaf Ebrahimi {
116*6467f958SSadaf Ebrahimi case CL_R: return "CL_R";
117*6467f958SSadaf Ebrahimi case CL_A: return "CL_A";
118*6467f958SSadaf Ebrahimi case CL_Rx: return "CL_Rx";
119*6467f958SSadaf Ebrahimi case CL_RG: return "CL_RG";
120*6467f958SSadaf Ebrahimi case CL_RA: return "CL_RA";
121*6467f958SSadaf Ebrahimi case CL_RGx: return "CL_RGx";
122*6467f958SSadaf Ebrahimi case CL_RGB: return "CL_RGB";
123*6467f958SSadaf Ebrahimi case CL_RGBx: return "CL_RGBx";
124*6467f958SSadaf Ebrahimi case CL_RGBA: return "CL_RGBA";
125*6467f958SSadaf Ebrahimi case CL_ARGB: return "CL_ARGB";
126*6467f958SSadaf Ebrahimi case CL_BGRA: return "CL_BGRA";
127*6467f958SSadaf Ebrahimi case CL_INTENSITY: return "CL_INTENSITY";
128*6467f958SSadaf Ebrahimi case CL_LUMINANCE: return "CL_LUMINANCE";
129*6467f958SSadaf Ebrahimi #if defined CL_1RGB_APPLE
130*6467f958SSadaf Ebrahimi case CL_1RGB_APPLE: return "CL_1RGB_APPLE";
131*6467f958SSadaf Ebrahimi #endif
132*6467f958SSadaf Ebrahimi #if defined CL_BGR1_APPLE
133*6467f958SSadaf Ebrahimi case CL_BGR1_APPLE: return "CL_BGR1_APPLE";
134*6467f958SSadaf Ebrahimi #endif
135*6467f958SSadaf Ebrahimi #if defined CL_ABGR_APPLE
136*6467f958SSadaf Ebrahimi case CL_ABGR_APPLE: return "CL_ABGR_APPLE";
137*6467f958SSadaf Ebrahimi #endif
138*6467f958SSadaf Ebrahimi case CL_DEPTH: return "CL_DEPTH";
139*6467f958SSadaf Ebrahimi case CL_DEPTH_STENCIL: return "CL_DEPTH_STENCIL";
140*6467f958SSadaf Ebrahimi case CL_sRGB: return "CL_sRGB";
141*6467f958SSadaf Ebrahimi case CL_sRGBA: return "CL_sRGBA";
142*6467f958SSadaf Ebrahimi case CL_sRGBx: return "CL_sRGBx";
143*6467f958SSadaf Ebrahimi case CL_sBGRA: return "CL_sBGRA";
144*6467f958SSadaf Ebrahimi case CL_ABGR: return "CL_ABGR";
145*6467f958SSadaf Ebrahimi default: return NULL;
146*6467f958SSadaf Ebrahimi }
147*6467f958SSadaf Ebrahimi }
148*6467f958SSadaf Ebrahimi
IsChannelOrderSupported(cl_channel_order order)149*6467f958SSadaf Ebrahimi int IsChannelOrderSupported(cl_channel_order order)
150*6467f958SSadaf Ebrahimi {
151*6467f958SSadaf Ebrahimi switch (order)
152*6467f958SSadaf Ebrahimi {
153*6467f958SSadaf Ebrahimi case CL_R:
154*6467f958SSadaf Ebrahimi case CL_A:
155*6467f958SSadaf Ebrahimi case CL_Rx:
156*6467f958SSadaf Ebrahimi case CL_RG:
157*6467f958SSadaf Ebrahimi case CL_RA:
158*6467f958SSadaf Ebrahimi case CL_RGx:
159*6467f958SSadaf Ebrahimi case CL_RGB:
160*6467f958SSadaf Ebrahimi case CL_RGBx:
161*6467f958SSadaf Ebrahimi case CL_RGBA:
162*6467f958SSadaf Ebrahimi case CL_ARGB:
163*6467f958SSadaf Ebrahimi case CL_BGRA:
164*6467f958SSadaf Ebrahimi case CL_INTENSITY:
165*6467f958SSadaf Ebrahimi case CL_LUMINANCE:
166*6467f958SSadaf Ebrahimi case CL_ABGR:
167*6467f958SSadaf Ebrahimi case CL_sRGB:
168*6467f958SSadaf Ebrahimi case CL_sRGBx:
169*6467f958SSadaf Ebrahimi case CL_sBGRA:
170*6467f958SSadaf Ebrahimi case CL_sRGBA:
171*6467f958SSadaf Ebrahimi case CL_DEPTH: return 1;
172*6467f958SSadaf Ebrahimi #if defined CL_1RGB_APPLE
173*6467f958SSadaf Ebrahimi case CL_1RGB_APPLE: return 1;
174*6467f958SSadaf Ebrahimi #endif
175*6467f958SSadaf Ebrahimi #if defined CL_BGR1_APPLE
176*6467f958SSadaf Ebrahimi case CL_BGR1_APPLE: return 1;
177*6467f958SSadaf Ebrahimi #endif
178*6467f958SSadaf Ebrahimi default: return 0;
179*6467f958SSadaf Ebrahimi }
180*6467f958SSadaf Ebrahimi }
181*6467f958SSadaf Ebrahimi
GetChannelTypeName(cl_channel_type type)182*6467f958SSadaf Ebrahimi const char *GetChannelTypeName(cl_channel_type type)
183*6467f958SSadaf Ebrahimi {
184*6467f958SSadaf Ebrahimi switch (type)
185*6467f958SSadaf Ebrahimi {
186*6467f958SSadaf Ebrahimi case CL_SNORM_INT8: return "CL_SNORM_INT8";
187*6467f958SSadaf Ebrahimi case CL_SNORM_INT16: return "CL_SNORM_INT16";
188*6467f958SSadaf Ebrahimi case CL_UNORM_INT8: return "CL_UNORM_INT8";
189*6467f958SSadaf Ebrahimi case CL_UNORM_INT16: return "CL_UNORM_INT16";
190*6467f958SSadaf Ebrahimi case CL_UNORM_SHORT_565: return "CL_UNORM_SHORT_565";
191*6467f958SSadaf Ebrahimi case CL_UNORM_SHORT_555: return "CL_UNORM_SHORT_555";
192*6467f958SSadaf Ebrahimi case CL_UNORM_INT_101010: return "CL_UNORM_INT_101010";
193*6467f958SSadaf Ebrahimi case CL_SIGNED_INT8: return "CL_SIGNED_INT8";
194*6467f958SSadaf Ebrahimi case CL_SIGNED_INT16: return "CL_SIGNED_INT16";
195*6467f958SSadaf Ebrahimi case CL_SIGNED_INT32: return "CL_SIGNED_INT32";
196*6467f958SSadaf Ebrahimi case CL_UNSIGNED_INT8: return "CL_UNSIGNED_INT8";
197*6467f958SSadaf Ebrahimi case CL_UNSIGNED_INT16: return "CL_UNSIGNED_INT16";
198*6467f958SSadaf Ebrahimi case CL_UNSIGNED_INT32: return "CL_UNSIGNED_INT32";
199*6467f958SSadaf Ebrahimi case CL_HALF_FLOAT: return "CL_HALF_FLOAT";
200*6467f958SSadaf Ebrahimi case CL_FLOAT: return "CL_FLOAT";
201*6467f958SSadaf Ebrahimi #ifdef CL_SFIXED14_APPLE
202*6467f958SSadaf Ebrahimi case CL_SFIXED14_APPLE: return "CL_SFIXED14_APPLE";
203*6467f958SSadaf Ebrahimi #endif
204*6467f958SSadaf Ebrahimi case CL_UNORM_INT24: return "CL_UNORM_INT24";
205*6467f958SSadaf Ebrahimi default: return NULL;
206*6467f958SSadaf Ebrahimi }
207*6467f958SSadaf Ebrahimi }
208*6467f958SSadaf Ebrahimi
IsChannelTypeSupported(cl_channel_type type)209*6467f958SSadaf Ebrahimi int IsChannelTypeSupported(cl_channel_type type)
210*6467f958SSadaf Ebrahimi {
211*6467f958SSadaf Ebrahimi switch (type)
212*6467f958SSadaf Ebrahimi {
213*6467f958SSadaf Ebrahimi case CL_SNORM_INT8:
214*6467f958SSadaf Ebrahimi case CL_SNORM_INT16:
215*6467f958SSadaf Ebrahimi case CL_UNORM_INT8:
216*6467f958SSadaf Ebrahimi case CL_UNORM_INT16:
217*6467f958SSadaf Ebrahimi case CL_UNORM_INT24:
218*6467f958SSadaf Ebrahimi case CL_UNORM_SHORT_565:
219*6467f958SSadaf Ebrahimi case CL_UNORM_SHORT_555:
220*6467f958SSadaf Ebrahimi case CL_UNORM_INT_101010:
221*6467f958SSadaf Ebrahimi case CL_SIGNED_INT8:
222*6467f958SSadaf Ebrahimi case CL_SIGNED_INT16:
223*6467f958SSadaf Ebrahimi case CL_SIGNED_INT32:
224*6467f958SSadaf Ebrahimi case CL_UNSIGNED_INT8:
225*6467f958SSadaf Ebrahimi case CL_UNSIGNED_INT16:
226*6467f958SSadaf Ebrahimi case CL_UNSIGNED_INT32:
227*6467f958SSadaf Ebrahimi case CL_HALF_FLOAT:
228*6467f958SSadaf Ebrahimi case CL_FLOAT: return 1;
229*6467f958SSadaf Ebrahimi #ifdef CL_SFIXED14_APPLE
230*6467f958SSadaf Ebrahimi case CL_SFIXED14_APPLE: return 1;
231*6467f958SSadaf Ebrahimi #endif
232*6467f958SSadaf Ebrahimi default: return 0;
233*6467f958SSadaf Ebrahimi }
234*6467f958SSadaf Ebrahimi }
235*6467f958SSadaf Ebrahimi
GetAddressModeName(cl_addressing_mode mode)236*6467f958SSadaf Ebrahimi const char *GetAddressModeName(cl_addressing_mode mode)
237*6467f958SSadaf Ebrahimi {
238*6467f958SSadaf Ebrahimi switch (mode)
239*6467f958SSadaf Ebrahimi {
240*6467f958SSadaf Ebrahimi case CL_ADDRESS_NONE: return "CL_ADDRESS_NONE";
241*6467f958SSadaf Ebrahimi case CL_ADDRESS_CLAMP_TO_EDGE: return "CL_ADDRESS_CLAMP_TO_EDGE";
242*6467f958SSadaf Ebrahimi case CL_ADDRESS_CLAMP: return "CL_ADDRESS_CLAMP";
243*6467f958SSadaf Ebrahimi case CL_ADDRESS_REPEAT: return "CL_ADDRESS_REPEAT";
244*6467f958SSadaf Ebrahimi case CL_ADDRESS_MIRRORED_REPEAT: return "CL_ADDRESS_MIRRORED_REPEAT";
245*6467f958SSadaf Ebrahimi default: return NULL;
246*6467f958SSadaf Ebrahimi }
247*6467f958SSadaf Ebrahimi }
248*6467f958SSadaf Ebrahimi
GetDeviceTypeName(cl_device_type type)249*6467f958SSadaf Ebrahimi const char *GetDeviceTypeName(cl_device_type type)
250*6467f958SSadaf Ebrahimi {
251*6467f958SSadaf Ebrahimi switch (type)
252*6467f958SSadaf Ebrahimi {
253*6467f958SSadaf Ebrahimi case CL_DEVICE_TYPE_GPU: return "CL_DEVICE_TYPE_GPU";
254*6467f958SSadaf Ebrahimi case CL_DEVICE_TYPE_CPU: return "CL_DEVICE_TYPE_CPU";
255*6467f958SSadaf Ebrahimi case CL_DEVICE_TYPE_ACCELERATOR: return "CL_DEVICE_TYPE_ACCELERATOR";
256*6467f958SSadaf Ebrahimi case CL_DEVICE_TYPE_ALL: return "CL_DEVICE_TYPE_ALL";
257*6467f958SSadaf Ebrahimi default: return NULL;
258*6467f958SSadaf Ebrahimi }
259*6467f958SSadaf Ebrahimi }
260*6467f958SSadaf Ebrahimi
GetDataVectorString(void * dataBuffer,size_t typeSize,size_t vecSize,char * buffer)261*6467f958SSadaf Ebrahimi const char *GetDataVectorString(void *dataBuffer, size_t typeSize,
262*6467f958SSadaf Ebrahimi size_t vecSize, char *buffer)
263*6467f958SSadaf Ebrahimi {
264*6467f958SSadaf Ebrahimi static char scratch[1024];
265*6467f958SSadaf Ebrahimi size_t i, j;
266*6467f958SSadaf Ebrahimi
267*6467f958SSadaf Ebrahimi if (buffer == NULL) buffer = scratch;
268*6467f958SSadaf Ebrahimi
269*6467f958SSadaf Ebrahimi unsigned char *p = (unsigned char *)dataBuffer;
270*6467f958SSadaf Ebrahimi char *bPtr;
271*6467f958SSadaf Ebrahimi
272*6467f958SSadaf Ebrahimi buffer[0] = 0;
273*6467f958SSadaf Ebrahimi bPtr = buffer;
274*6467f958SSadaf Ebrahimi for (i = 0; i < vecSize; i++)
275*6467f958SSadaf Ebrahimi {
276*6467f958SSadaf Ebrahimi if (i > 0)
277*6467f958SSadaf Ebrahimi {
278*6467f958SSadaf Ebrahimi bPtr[0] = ' ';
279*6467f958SSadaf Ebrahimi bPtr++;
280*6467f958SSadaf Ebrahimi }
281*6467f958SSadaf Ebrahimi for (j = 0; j < typeSize; j++)
282*6467f958SSadaf Ebrahimi {
283*6467f958SSadaf Ebrahimi sprintf(bPtr, "%02x", (unsigned int)p[typeSize - j - 1]);
284*6467f958SSadaf Ebrahimi bPtr += 2;
285*6467f958SSadaf Ebrahimi }
286*6467f958SSadaf Ebrahimi p += typeSize;
287*6467f958SSadaf Ebrahimi }
288*6467f958SSadaf Ebrahimi bPtr[0] = 0;
289*6467f958SSadaf Ebrahimi
290*6467f958SSadaf Ebrahimi return buffer;
291*6467f958SSadaf Ebrahimi }
292*6467f958SSadaf Ebrahimi
GetQueuePropertyName(cl_command_queue_properties property)293*6467f958SSadaf Ebrahimi const char *GetQueuePropertyName(cl_command_queue_properties property)
294*6467f958SSadaf Ebrahimi {
295*6467f958SSadaf Ebrahimi switch (property)
296*6467f958SSadaf Ebrahimi {
297*6467f958SSadaf Ebrahimi case CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE:
298*6467f958SSadaf Ebrahimi return "CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE";
299*6467f958SSadaf Ebrahimi case CL_QUEUE_PROFILING_ENABLE: return "CL_QUEUE_PROFILING_ENABLE";
300*6467f958SSadaf Ebrahimi case CL_QUEUE_ON_DEVICE: return "CL_QUEUE_ON_DEVICE";
301*6467f958SSadaf Ebrahimi case CL_QUEUE_ON_DEVICE_DEFAULT: return "CL_QUEUE_ON_DEVICE_DEFAULT";
302*6467f958SSadaf Ebrahimi default: return "(unknown)";
303*6467f958SSadaf Ebrahimi }
304*6467f958SSadaf Ebrahimi }
305*6467f958SSadaf Ebrahimi
306*6467f958SSadaf Ebrahimi #if defined(_MSC_VER)
307*6467f958SSadaf Ebrahimi #define scalbnf(_a, _i) ldexpf(_a, _i)
308*6467f958SSadaf Ebrahimi #define scalbn(_a, _i) ldexp(_a, _i)
309*6467f958SSadaf Ebrahimi #define scalbnl(_a, _i) ldexpl(_a, _i)
310*6467f958SSadaf Ebrahimi #endif
311*6467f958SSadaf Ebrahimi
312*6467f958SSadaf Ebrahimi // taken from math tests
313*6467f958SSadaf Ebrahimi #define HALF_MIN_EXP -13
314*6467f958SSadaf Ebrahimi #define HALF_MANT_DIG 11
Ulp_Error_Half_Float(float test,double reference)315*6467f958SSadaf Ebrahimi static float Ulp_Error_Half_Float(float test, double reference)
316*6467f958SSadaf Ebrahimi {
317*6467f958SSadaf Ebrahimi union {
318*6467f958SSadaf Ebrahimi double d;
319*6467f958SSadaf Ebrahimi uint64_t u;
320*6467f958SSadaf Ebrahimi } u;
321*6467f958SSadaf Ebrahimi u.d = reference;
322*6467f958SSadaf Ebrahimi
323*6467f958SSadaf Ebrahimi // Note: This function presumes that someone has already tested whether the
324*6467f958SSadaf Ebrahimi // result is correctly, rounded before calling this function. That test:
325*6467f958SSadaf Ebrahimi //
326*6467f958SSadaf Ebrahimi // if( (float) reference == test )
327*6467f958SSadaf Ebrahimi // return 0.0f;
328*6467f958SSadaf Ebrahimi //
329*6467f958SSadaf Ebrahimi // would ensure that cases like fabs(reference) > FLT_MAX are weeded out
330*6467f958SSadaf Ebrahimi // before we get here. Otherwise, we'll return inf ulp error here, for what
331*6467f958SSadaf Ebrahimi // are otherwise correctly rounded results.
332*6467f958SSadaf Ebrahimi
333*6467f958SSadaf Ebrahimi double testVal = test;
334*6467f958SSadaf Ebrahimi
335*6467f958SSadaf Ebrahimi if (isinf(reference))
336*6467f958SSadaf Ebrahimi {
337*6467f958SSadaf Ebrahimi if (testVal == reference) return 0.0f;
338*6467f958SSadaf Ebrahimi
339*6467f958SSadaf Ebrahimi return (float)(testVal - reference);
340*6467f958SSadaf Ebrahimi }
341*6467f958SSadaf Ebrahimi
342*6467f958SSadaf Ebrahimi if (isinf(testVal))
343*6467f958SSadaf Ebrahimi {
344*6467f958SSadaf Ebrahimi // Allow overflow within the limit of the allowed ulp error. Towards
345*6467f958SSadaf Ebrahimi // that end we pretend the test value is actually 2**16, the next value
346*6467f958SSadaf Ebrahimi // that would appear in the number line if half had sufficient range.
347*6467f958SSadaf Ebrahimi testVal = copysign(65536.0, testVal);
348*6467f958SSadaf Ebrahimi }
349*6467f958SSadaf Ebrahimi
350*6467f958SSadaf Ebrahimi
351*6467f958SSadaf Ebrahimi if (u.u & 0x000fffffffffffffULL)
352*6467f958SSadaf Ebrahimi { // Non-power of two and NaN
353*6467f958SSadaf Ebrahimi if (isnan(reference) && isnan(test))
354*6467f958SSadaf Ebrahimi return 0.0f; // if we are expecting a NaN, any NaN is fine
355*6467f958SSadaf Ebrahimi
356*6467f958SSadaf Ebrahimi // The unbiased exponent of the ulp unit place
357*6467f958SSadaf Ebrahimi int ulp_exp =
358*6467f958SSadaf Ebrahimi HALF_MANT_DIG - 1 - std::max(ilogb(reference), HALF_MIN_EXP - 1);
359*6467f958SSadaf Ebrahimi
360*6467f958SSadaf Ebrahimi // Scale the exponent of the error
361*6467f958SSadaf Ebrahimi return (float)scalbn(testVal - reference, ulp_exp);
362*6467f958SSadaf Ebrahimi }
363*6467f958SSadaf Ebrahimi
364*6467f958SSadaf Ebrahimi // reference is a normal power of two or a zero
365*6467f958SSadaf Ebrahimi int ulp_exp =
366*6467f958SSadaf Ebrahimi HALF_MANT_DIG - 1 - std::max(ilogb(reference) - 1, HALF_MIN_EXP - 1);
367*6467f958SSadaf Ebrahimi
368*6467f958SSadaf Ebrahimi // Scale the exponent of the error
369*6467f958SSadaf Ebrahimi return (float)scalbn(testVal - reference, ulp_exp);
370*6467f958SSadaf Ebrahimi }
371*6467f958SSadaf Ebrahimi
Ulp_Error_Half(cl_half test,float reference)372*6467f958SSadaf Ebrahimi float Ulp_Error_Half(cl_half test, float reference)
373*6467f958SSadaf Ebrahimi {
374*6467f958SSadaf Ebrahimi return Ulp_Error_Half_Float(cl_half_to_float(test), reference);
375*6467f958SSadaf Ebrahimi }
376*6467f958SSadaf Ebrahimi
377*6467f958SSadaf Ebrahimi
Ulp_Error(float test,double reference)378*6467f958SSadaf Ebrahimi float Ulp_Error(float test, double reference)
379*6467f958SSadaf Ebrahimi {
380*6467f958SSadaf Ebrahimi union {
381*6467f958SSadaf Ebrahimi double d;
382*6467f958SSadaf Ebrahimi uint64_t u;
383*6467f958SSadaf Ebrahimi } u;
384*6467f958SSadaf Ebrahimi u.d = reference;
385*6467f958SSadaf Ebrahimi double testVal = test;
386*6467f958SSadaf Ebrahimi
387*6467f958SSadaf Ebrahimi // Note: This function presumes that someone has already tested whether the
388*6467f958SSadaf Ebrahimi // result is correctly, rounded before calling this function. That test:
389*6467f958SSadaf Ebrahimi //
390*6467f958SSadaf Ebrahimi // if( (float) reference == test )
391*6467f958SSadaf Ebrahimi // return 0.0f;
392*6467f958SSadaf Ebrahimi //
393*6467f958SSadaf Ebrahimi // would ensure that cases like fabs(reference) > FLT_MAX are weeded out
394*6467f958SSadaf Ebrahimi // before we get here. Otherwise, we'll return inf ulp error here, for what
395*6467f958SSadaf Ebrahimi // are otherwise correctly rounded results.
396*6467f958SSadaf Ebrahimi
397*6467f958SSadaf Ebrahimi
398*6467f958SSadaf Ebrahimi if (isinf(reference))
399*6467f958SSadaf Ebrahimi {
400*6467f958SSadaf Ebrahimi if (testVal == reference) return 0.0f;
401*6467f958SSadaf Ebrahimi
402*6467f958SSadaf Ebrahimi return (float)(testVal - reference);
403*6467f958SSadaf Ebrahimi }
404*6467f958SSadaf Ebrahimi
405*6467f958SSadaf Ebrahimi if (isinf(testVal))
406*6467f958SSadaf Ebrahimi { // infinite test value, but finite (but possibly overflowing in float)
407*6467f958SSadaf Ebrahimi // reference.
408*6467f958SSadaf Ebrahimi //
409*6467f958SSadaf Ebrahimi // The function probably overflowed prematurely here. Formally, the spec
410*6467f958SSadaf Ebrahimi // says this is an infinite ulp error and should not be tolerated.
411*6467f958SSadaf Ebrahimi // Unfortunately, this would mean that the internal precision of some
412*6467f958SSadaf Ebrahimi // half_pow implementations would have to be 29+ bits at half_powr(
413*6467f958SSadaf Ebrahimi // 0x1.fffffep+31, 4) to correctly determine that 4*log2( 0x1.fffffep+31 )
414*6467f958SSadaf Ebrahimi // is not exactly 128.0. You might represent this for example as 4*(32 -
415*6467f958SSadaf Ebrahimi // ~2**-24), which after rounding to single is 4*32 = 128, which will
416*6467f958SSadaf Ebrahimi // ultimately result in premature overflow, even though a good faith
417*6467f958SSadaf Ebrahimi // representation would be correct to within 2**-29 interally.
418*6467f958SSadaf Ebrahimi
419*6467f958SSadaf Ebrahimi // In the interest of not requiring the implementation go to
420*6467f958SSadaf Ebrahimi // extraordinary lengths to deliver a half precision function, we allow
421*6467f958SSadaf Ebrahimi // premature overflow within the limit of the allowed ulp error.
422*6467f958SSadaf Ebrahimi // Towards, that end, we "pretend" the test value is actually 2**128,
423*6467f958SSadaf Ebrahimi // the next value that would appear in the number line if float had
424*6467f958SSadaf Ebrahimi // sufficient range.
425*6467f958SSadaf Ebrahimi testVal = copysign(MAKE_HEX_DOUBLE(0x1.0p128, 0x1LL, 128), testVal);
426*6467f958SSadaf Ebrahimi
427*6467f958SSadaf Ebrahimi // Note that the same hack may not work in long double, which is not
428*6467f958SSadaf Ebrahimi // guaranteed to have more range than double. It is not clear that
429*6467f958SSadaf Ebrahimi // premature overflow should be tolerated for double.
430*6467f958SSadaf Ebrahimi }
431*6467f958SSadaf Ebrahimi
432*6467f958SSadaf Ebrahimi if (u.u & 0x000fffffffffffffULL)
433*6467f958SSadaf Ebrahimi { // Non-power of two and NaN
434*6467f958SSadaf Ebrahimi if (isnan(reference) && isnan(test))
435*6467f958SSadaf Ebrahimi return 0.0f; // if we are expecting a NaN, any NaN is fine
436*6467f958SSadaf Ebrahimi
437*6467f958SSadaf Ebrahimi // The unbiased exponent of the ulp unit place
438*6467f958SSadaf Ebrahimi int ulp_exp =
439*6467f958SSadaf Ebrahimi FLT_MANT_DIG - 1 - std::max(ilogb(reference), FLT_MIN_EXP - 1);
440*6467f958SSadaf Ebrahimi
441*6467f958SSadaf Ebrahimi // Scale the exponent of the error
442*6467f958SSadaf Ebrahimi return (float)scalbn(testVal - reference, ulp_exp);
443*6467f958SSadaf Ebrahimi }
444*6467f958SSadaf Ebrahimi
445*6467f958SSadaf Ebrahimi // reference is a normal power of two or a zero
446*6467f958SSadaf Ebrahimi // The unbiased exponent of the ulp unit place
447*6467f958SSadaf Ebrahimi int ulp_exp =
448*6467f958SSadaf Ebrahimi FLT_MANT_DIG - 1 - std::max(ilogb(reference) - 1, FLT_MIN_EXP - 1);
449*6467f958SSadaf Ebrahimi
450*6467f958SSadaf Ebrahimi // Scale the exponent of the error
451*6467f958SSadaf Ebrahimi return (float)scalbn(testVal - reference, ulp_exp);
452*6467f958SSadaf Ebrahimi }
453*6467f958SSadaf Ebrahimi
Ulp_Error_Double(double test,long double reference)454*6467f958SSadaf Ebrahimi float Ulp_Error_Double(double test, long double reference)
455*6467f958SSadaf Ebrahimi {
456*6467f958SSadaf Ebrahimi // Deal with long double = double
457*6467f958SSadaf Ebrahimi // On most systems long double is a higher precision type than double. They
458*6467f958SSadaf Ebrahimi // provide either a 80-bit or greater floating point type, or they provide a
459*6467f958SSadaf Ebrahimi // head-tail double double format. That is sufficient to represent the
460*6467f958SSadaf Ebrahimi // accuracy of a floating point result to many more bits than double and we
461*6467f958SSadaf Ebrahimi // can calculate sub-ulp errors. This is the standard system for which this
462*6467f958SSadaf Ebrahimi // test suite is designed.
463*6467f958SSadaf Ebrahimi //
464*6467f958SSadaf Ebrahimi // On some systems double and long double are the same thing. Then we run
465*6467f958SSadaf Ebrahimi // into a problem, because our representation of the infinitely precise
466*6467f958SSadaf Ebrahimi // result (passed in as reference above) can be off by as much as a half
467*6467f958SSadaf Ebrahimi // double precision ulp itself. In this case, we inflate the reported error
468*6467f958SSadaf Ebrahimi // by half an ulp to take this into account. A more correct and permanent
469*6467f958SSadaf Ebrahimi // fix would be to undertake refactoring the reference code to return
470*6467f958SSadaf Ebrahimi // results in this format:
471*6467f958SSadaf Ebrahimi //
472*6467f958SSadaf Ebrahimi // typedef struct DoubleReference
473*6467f958SSadaf Ebrahimi // {
474*6467f958SSadaf Ebrahimi // // true value = correctlyRoundedResult + ulps *
475*6467f958SSadaf Ebrahimi // // ulp(correctlyRoundedResult) (infinitely precise)
476*6467f958SSadaf Ebrahimi // // as best we can:
477*6467f958SSadaf Ebrahimi // double correctlyRoundedResult;
478*6467f958SSadaf Ebrahimi // // plus a fractional amount to account for the difference
479*6467f958SSadaf Ebrahimi // // between infinitely precise result and correctlyRoundedResult,
480*6467f958SSadaf Ebrahimi // // in units of ulps:
481*6467f958SSadaf Ebrahimi // double ulps;
482*6467f958SSadaf Ebrahimi // } DoubleReference;
483*6467f958SSadaf Ebrahimi //
484*6467f958SSadaf Ebrahimi // This would provide a useful higher-than-double precision format for
485*6467f958SSadaf Ebrahimi // everyone that we can use, and would solve a few problems with
486*6467f958SSadaf Ebrahimi // representing absolute errors below DBL_MIN and over DBL_MAX for systems
487*6467f958SSadaf Ebrahimi // that use a head to tail double double for long double.
488*6467f958SSadaf Ebrahimi
489*6467f958SSadaf Ebrahimi // Note: This function presumes that someone has already tested whether the
490*6467f958SSadaf Ebrahimi // result is correctly, rounded before calling this function. That test:
491*6467f958SSadaf Ebrahimi //
492*6467f958SSadaf Ebrahimi // if( (float) reference == test )
493*6467f958SSadaf Ebrahimi // return 0.0f;
494*6467f958SSadaf Ebrahimi //
495*6467f958SSadaf Ebrahimi // would ensure that cases like fabs(reference) > FLT_MAX are weeded out
496*6467f958SSadaf Ebrahimi // before we get here. Otherwise, we'll return inf ulp error here, for what
497*6467f958SSadaf Ebrahimi // are otherwise correctly rounded results.
498*6467f958SSadaf Ebrahimi
499*6467f958SSadaf Ebrahimi
500*6467f958SSadaf Ebrahimi int x;
501*6467f958SSadaf Ebrahimi long double testVal = test;
502*6467f958SSadaf Ebrahimi if (0.5L != frexpl(reference, &x))
503*6467f958SSadaf Ebrahimi { // Non-power of two and NaN
504*6467f958SSadaf Ebrahimi if (isinf(reference))
505*6467f958SSadaf Ebrahimi {
506*6467f958SSadaf Ebrahimi if (testVal == reference) return 0.0f;
507*6467f958SSadaf Ebrahimi
508*6467f958SSadaf Ebrahimi return (float)(testVal - reference);
509*6467f958SSadaf Ebrahimi }
510*6467f958SSadaf Ebrahimi
511*6467f958SSadaf Ebrahimi if (isnan(reference) && isnan(test))
512*6467f958SSadaf Ebrahimi return 0.0f; // if we are expecting a NaN, any NaN is fine
513*6467f958SSadaf Ebrahimi
514*6467f958SSadaf Ebrahimi // The unbiased exponent of the ulp unit place
515*6467f958SSadaf Ebrahimi int ulp_exp =
516*6467f958SSadaf Ebrahimi DBL_MANT_DIG - 1 - std::max(ilogbl(reference), DBL_MIN_EXP - 1);
517*6467f958SSadaf Ebrahimi
518*6467f958SSadaf Ebrahimi // Scale the exponent of the error
519*6467f958SSadaf Ebrahimi float result = (float)scalbnl(testVal - reference, ulp_exp);
520*6467f958SSadaf Ebrahimi
521*6467f958SSadaf Ebrahimi // account for rounding error in reference result on systems that do not
522*6467f958SSadaf Ebrahimi // have a higher precision floating point type (see above)
523*6467f958SSadaf Ebrahimi if (sizeof(long double) == sizeof(double))
524*6467f958SSadaf Ebrahimi result += copysignf(0.5f, result);
525*6467f958SSadaf Ebrahimi
526*6467f958SSadaf Ebrahimi return result;
527*6467f958SSadaf Ebrahimi }
528*6467f958SSadaf Ebrahimi
529*6467f958SSadaf Ebrahimi // reference is a normal power of two or a zero
530*6467f958SSadaf Ebrahimi // The unbiased exponent of the ulp unit place
531*6467f958SSadaf Ebrahimi int ulp_exp =
532*6467f958SSadaf Ebrahimi DBL_MANT_DIG - 1 - std::max(ilogbl(reference) - 1, DBL_MIN_EXP - 1);
533*6467f958SSadaf Ebrahimi
534*6467f958SSadaf Ebrahimi // Scale the exponent of the error
535*6467f958SSadaf Ebrahimi float result = (float)scalbnl(testVal - reference, ulp_exp);
536*6467f958SSadaf Ebrahimi
537*6467f958SSadaf Ebrahimi // account for rounding error in reference result on systems that do not
538*6467f958SSadaf Ebrahimi // have a higher precision floating point type (see above)
539*6467f958SSadaf Ebrahimi if (sizeof(long double) == sizeof(double))
540*6467f958SSadaf Ebrahimi result += copysignf(0.5f, result);
541*6467f958SSadaf Ebrahimi
542*6467f958SSadaf Ebrahimi return result;
543*6467f958SSadaf Ebrahimi }
544*6467f958SSadaf Ebrahimi
OutputBuildLogs(cl_program program,cl_uint num_devices,cl_device_id * device_list)545*6467f958SSadaf Ebrahimi cl_int OutputBuildLogs(cl_program program, cl_uint num_devices,
546*6467f958SSadaf Ebrahimi cl_device_id *device_list)
547*6467f958SSadaf Ebrahimi {
548*6467f958SSadaf Ebrahimi int error;
549*6467f958SSadaf Ebrahimi size_t size_ret;
550*6467f958SSadaf Ebrahimi
551*6467f958SSadaf Ebrahimi // Does the program object exist?
552*6467f958SSadaf Ebrahimi if (program != NULL)
553*6467f958SSadaf Ebrahimi {
554*6467f958SSadaf Ebrahimi
555*6467f958SSadaf Ebrahimi // Was the number of devices given
556*6467f958SSadaf Ebrahimi if (num_devices == 0)
557*6467f958SSadaf Ebrahimi {
558*6467f958SSadaf Ebrahimi
559*6467f958SSadaf Ebrahimi // If zero devices were specified then allocate and query the device
560*6467f958SSadaf Ebrahimi // list from the context
561*6467f958SSadaf Ebrahimi cl_context context;
562*6467f958SSadaf Ebrahimi error = clGetProgramInfo(program, CL_PROGRAM_CONTEXT,
563*6467f958SSadaf Ebrahimi sizeof(context), &context, NULL);
564*6467f958SSadaf Ebrahimi test_error(error, "Unable to query program's context");
565*6467f958SSadaf Ebrahimi error = clGetContextInfo(context, CL_CONTEXT_DEVICES, 0, NULL,
566*6467f958SSadaf Ebrahimi &size_ret);
567*6467f958SSadaf Ebrahimi test_error(error, "Unable to query context's device size");
568*6467f958SSadaf Ebrahimi num_devices = static_cast<cl_uint>(size_ret / sizeof(cl_device_id));
569*6467f958SSadaf Ebrahimi device_list = (cl_device_id *)malloc(size_ret);
570*6467f958SSadaf Ebrahimi if (device_list == NULL)
571*6467f958SSadaf Ebrahimi {
572*6467f958SSadaf Ebrahimi print_error(error, "malloc failed");
573*6467f958SSadaf Ebrahimi return CL_OUT_OF_HOST_MEMORY;
574*6467f958SSadaf Ebrahimi }
575*6467f958SSadaf Ebrahimi error = clGetContextInfo(context, CL_CONTEXT_DEVICES, size_ret,
576*6467f958SSadaf Ebrahimi device_list, NULL);
577*6467f958SSadaf Ebrahimi test_error(error, "Unable to query context's devices");
578*6467f958SSadaf Ebrahimi }
579*6467f958SSadaf Ebrahimi
580*6467f958SSadaf Ebrahimi // For each device in the device_list
581*6467f958SSadaf Ebrahimi unsigned int i;
582*6467f958SSadaf Ebrahimi for (i = 0; i < num_devices; i++)
583*6467f958SSadaf Ebrahimi {
584*6467f958SSadaf Ebrahimi
585*6467f958SSadaf Ebrahimi // Get the build status
586*6467f958SSadaf Ebrahimi cl_build_status build_status;
587*6467f958SSadaf Ebrahimi error = clGetProgramBuildInfo(
588*6467f958SSadaf Ebrahimi program, device_list[i], CL_PROGRAM_BUILD_STATUS,
589*6467f958SSadaf Ebrahimi sizeof(build_status), &build_status, &size_ret);
590*6467f958SSadaf Ebrahimi test_error(error, "Unable to query build status");
591*6467f958SSadaf Ebrahimi
592*6467f958SSadaf Ebrahimi // If the build failed then log the status, and allocate the build
593*6467f958SSadaf Ebrahimi // log, log it and free it
594*6467f958SSadaf Ebrahimi if (build_status != CL_BUILD_SUCCESS)
595*6467f958SSadaf Ebrahimi {
596*6467f958SSadaf Ebrahimi
597*6467f958SSadaf Ebrahimi log_error("ERROR: CL_PROGRAM_BUILD_STATUS=%d\n",
598*6467f958SSadaf Ebrahimi (int)build_status);
599*6467f958SSadaf Ebrahimi error = clGetProgramBuildInfo(program, device_list[i],
600*6467f958SSadaf Ebrahimi CL_PROGRAM_BUILD_LOG, 0, NULL,
601*6467f958SSadaf Ebrahimi &size_ret);
602*6467f958SSadaf Ebrahimi test_error(error, "Unable to query build log size");
603*6467f958SSadaf Ebrahimi char *build_log = (char *)malloc(size_ret);
604*6467f958SSadaf Ebrahimi error = clGetProgramBuildInfo(program, device_list[i],
605*6467f958SSadaf Ebrahimi CL_PROGRAM_BUILD_LOG, size_ret,
606*6467f958SSadaf Ebrahimi build_log, &size_ret);
607*6467f958SSadaf Ebrahimi test_error(error, "Unable to query build log");
608*6467f958SSadaf Ebrahimi log_error("ERROR: CL_PROGRAM_BUILD_LOG:\n%s\n", build_log);
609*6467f958SSadaf Ebrahimi free(build_log);
610*6467f958SSadaf Ebrahimi }
611*6467f958SSadaf Ebrahimi }
612*6467f958SSadaf Ebrahimi
613*6467f958SSadaf Ebrahimi // Was the number of devices given
614*6467f958SSadaf Ebrahimi if (num_devices == 0)
615*6467f958SSadaf Ebrahimi {
616*6467f958SSadaf Ebrahimi
617*6467f958SSadaf Ebrahimi // If zero devices were specified then free the device list
618*6467f958SSadaf Ebrahimi free(device_list);
619*6467f958SSadaf Ebrahimi }
620*6467f958SSadaf Ebrahimi }
621*6467f958SSadaf Ebrahimi
622*6467f958SSadaf Ebrahimi return CL_SUCCESS;
623*6467f958SSadaf Ebrahimi }
624*6467f958SSadaf Ebrahimi
625*6467f958SSadaf Ebrahimi const char *subtests_to_skip_with_offline_compiler[] = {
626*6467f958SSadaf Ebrahimi "get_kernel_arg_info",
627*6467f958SSadaf Ebrahimi "binary_create",
628*6467f958SSadaf Ebrahimi "load_program_source",
629*6467f958SSadaf Ebrahimi "load_multistring_source",
630*6467f958SSadaf Ebrahimi "load_two_kernel_source",
631*6467f958SSadaf Ebrahimi "load_null_terminated_source",
632*6467f958SSadaf Ebrahimi "load_null_terminated_multi_line_source",
633*6467f958SSadaf Ebrahimi "load_null_terminated_partial_multi_line_source",
634*6467f958SSadaf Ebrahimi "load_discreet_length_source",
635*6467f958SSadaf Ebrahimi "get_program_source",
636*6467f958SSadaf Ebrahimi "get_program_build_info",
637*6467f958SSadaf Ebrahimi "options_build_optimizations",
638*6467f958SSadaf Ebrahimi "options_build_macro",
639*6467f958SSadaf Ebrahimi "options_build_macro_existence",
640*6467f958SSadaf Ebrahimi "options_include_directory",
641*6467f958SSadaf Ebrahimi "options_denorm_cache",
642*6467f958SSadaf Ebrahimi "preprocessor_define_udef",
643*6467f958SSadaf Ebrahimi "preprocessor_include",
644*6467f958SSadaf Ebrahimi "preprocessor_line_error",
645*6467f958SSadaf Ebrahimi "preprocessor_pragma",
646*6467f958SSadaf Ebrahimi "compiler_defines_for_extensions",
647*6467f958SSadaf Ebrahimi "image_macro",
648*6467f958SSadaf Ebrahimi "simple_extern_compile_only",
649*6467f958SSadaf Ebrahimi "simple_embedded_header_compile",
650*6467f958SSadaf Ebrahimi "two_file_regular_variable_access",
651*6467f958SSadaf Ebrahimi "two_file_regular_struct_access",
652*6467f958SSadaf Ebrahimi "two_file_regular_function_access",
653*6467f958SSadaf Ebrahimi "simple_embedded_header_link",
654*6467f958SSadaf Ebrahimi "execute_after_simple_compile_and_link_with_defines",
655*6467f958SSadaf Ebrahimi "execute_after_simple_compile_and_link_with_callbacks",
656*6467f958SSadaf Ebrahimi "execute_after_embedded_header_link",
657*6467f958SSadaf Ebrahimi "execute_after_included_header_link",
658*6467f958SSadaf Ebrahimi "multi_file_libraries",
659*6467f958SSadaf Ebrahimi "multiple_files",
660*6467f958SSadaf Ebrahimi "multiple_libraries",
661*6467f958SSadaf Ebrahimi "multiple_files_multiple_libraries",
662*6467f958SSadaf Ebrahimi "multiple_embedded_headers",
663*6467f958SSadaf Ebrahimi "program_binary_type",
664*6467f958SSadaf Ebrahimi "compile_and_link_status_options_log",
665*6467f958SSadaf Ebrahimi "kernel_preprocessor_macros",
666*6467f958SSadaf Ebrahimi "execute_after_serialize_reload_library",
667*6467f958SSadaf Ebrahimi "execute_after_serialize_reload_object",
668*6467f958SSadaf Ebrahimi "execute_after_simple_compile_and_link",
669*6467f958SSadaf Ebrahimi "execute_after_simple_compile_and_link_no_device_info",
670*6467f958SSadaf Ebrahimi "execute_after_simple_library_with_link",
671*6467f958SSadaf Ebrahimi "execute_after_two_file_link",
672*6467f958SSadaf Ebrahimi "simple_compile_only",
673*6467f958SSadaf Ebrahimi "simple_compile_with_callback",
674*6467f958SSadaf Ebrahimi "simple_library_only",
675*6467f958SSadaf Ebrahimi "simple_library_with_callback",
676*6467f958SSadaf Ebrahimi "simple_library_with_link",
677*6467f958SSadaf Ebrahimi "simple_link_only",
678*6467f958SSadaf Ebrahimi "simple_link_with_callback",
679*6467f958SSadaf Ebrahimi "simple_static_compile_only",
680*6467f958SSadaf Ebrahimi "two_file_link",
681*6467f958SSadaf Ebrahimi "async_build",
682*6467f958SSadaf Ebrahimi "unload_repeated",
683*6467f958SSadaf Ebrahimi "unload_compile_unload_link",
684*6467f958SSadaf Ebrahimi "unload_build_unload_create_kernel",
685*6467f958SSadaf Ebrahimi "unload_link_different",
686*6467f958SSadaf Ebrahimi "unload_build_threaded",
687*6467f958SSadaf Ebrahimi "unload_build_info",
688*6467f958SSadaf Ebrahimi "unload_program_binaries",
689*6467f958SSadaf Ebrahimi "features_macro",
690*6467f958SSadaf Ebrahimi "progvar_prog_scope_misc",
691*6467f958SSadaf Ebrahimi "library_function"
692*6467f958SSadaf Ebrahimi };
693*6467f958SSadaf Ebrahimi
check_functions_for_offline_compiler(const char * subtestname)694*6467f958SSadaf Ebrahimi bool check_functions_for_offline_compiler(const char *subtestname)
695*6467f958SSadaf Ebrahimi {
696*6467f958SSadaf Ebrahimi if (gCompilationMode != kOnline)
697*6467f958SSadaf Ebrahimi {
698*6467f958SSadaf Ebrahimi size_t nNotRequiredWithOfflineCompiler =
699*6467f958SSadaf Ebrahimi ARRAY_SIZE(subtests_to_skip_with_offline_compiler);
700*6467f958SSadaf Ebrahimi for (size_t i = 0; i < nNotRequiredWithOfflineCompiler; ++i)
701*6467f958SSadaf Ebrahimi {
702*6467f958SSadaf Ebrahimi if (!strcmp(subtestname, subtests_to_skip_with_offline_compiler[i]))
703*6467f958SSadaf Ebrahimi {
704*6467f958SSadaf Ebrahimi return false;
705*6467f958SSadaf Ebrahimi }
706*6467f958SSadaf Ebrahimi }
707*6467f958SSadaf Ebrahimi }
708*6467f958SSadaf Ebrahimi return true;
709*6467f958SSadaf Ebrahimi }
710