1 1.1 christos /* This testcase is part of GDB, the GNU debugger. 2 1.1 christos 3 1.11 christos Copyright 2010-2024 Free Software Foundation, Inc. 4 1.1 christos 5 1.1 christos This program is free software; you can redistribute it and/or modify 6 1.1 christos it under the terms of the GNU General Public License as published by 7 1.1 christos the Free Software Foundation; either version 3 of the License, or 8 1.1 christos (at your option) any later version. 9 1.1 christos 10 1.1 christos This program is distributed in the hope that it will be useful, 11 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of 12 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 1.1 christos GNU General Public License for more details. 14 1.1 christos 15 1.1 christos You should have received a copy of the GNU General Public License 16 1.1 christos along with this program. If not, see <http://www.gnu.org/licenses/>. 17 1.1 christos 18 1.1 christos Contributed by Ken Werner <ken.werner (at) de.ibm.com> */ 19 1.1 christos 20 1.1 christos /* Utility macros and functions for OpenCL applications. */ 21 1.1 christos 22 1.1 christos #include "cl_util.h" 23 1.1 christos 24 1.1 christos #include <stdlib.h> 25 1.1 christos #include <errno.h> 26 1.1 christos #include <sys/stat.h> 27 1.1 christos #include <string.h> 28 1.1 christos 29 1.1 christos const char *get_clerror_string (int errcode) 30 1.1 christos { 31 1.1 christos switch (errcode) 32 1.1 christos { 33 1.1 christos case CL_SUCCESS: 34 1.1 christos return "CL_SUCCESS"; 35 1.1 christos case CL_DEVICE_NOT_FOUND: 36 1.1 christos return "CL_DEVICE_NOT_FOUND"; 37 1.1 christos case CL_DEVICE_NOT_AVAILABLE: 38 1.1 christos return "CL_DEVICE_NOT_AVAILABLE"; 39 1.1 christos case CL_COMPILER_NOT_AVAILABLE: 40 1.1 christos return "CL_COMPILER_NOT_AVAILABLE"; 41 1.1 christos case CL_MEM_OBJECT_ALLOCATION_FAILURE: 42 1.1 christos return "CL_MEM_OBJECT_ALLOCATION_FAILURE"; 43 1.1 christos case CL_OUT_OF_RESOURCES: 44 1.1 christos return "CL_OUT_OF_RESOURCES"; 45 1.1 christos case CL_OUT_OF_HOST_MEMORY: 46 1.1 christos return "CL_OUT_OF_HOST_MEMORY"; 47 1.1 christos case CL_PROFILING_INFO_NOT_AVAILABLE: 48 1.1 christos return "CL_PROFILING_INFO_NOT_AVAILABLE"; 49 1.1 christos case CL_MEM_COPY_OVERLAP: 50 1.1 christos return "CL_MEM_COPY_OVERLAP"; 51 1.1 christos case CL_IMAGE_FORMAT_MISMATCH: 52 1.1 christos return "CL_IMAGE_FORMAT_MISMATCH"; 53 1.1 christos case CL_IMAGE_FORMAT_NOT_SUPPORTED: 54 1.1 christos return "CL_IMAGE_FORMAT_NOT_SUPPORTED"; 55 1.1 christos case CL_BUILD_PROGRAM_FAILURE: 56 1.1 christos return "CL_BUILD_PROGRAM_FAILURE"; 57 1.1 christos case CL_MAP_FAILURE: 58 1.1 christos return "CL_MAP_FAILURE"; 59 1.1 christos case CL_INVALID_VALUE: 60 1.1 christos return "CL_INVALID_VALUE"; 61 1.1 christos case CL_INVALID_DEVICE_TYPE: 62 1.1 christos return "CL_INVALID_DEVICE_TYPE"; 63 1.1 christos case CL_INVALID_PLATFORM: 64 1.1 christos return "CL_INVALID_PLATFORM"; 65 1.1 christos case CL_INVALID_DEVICE: 66 1.1 christos return "CL_INVALID_DEVICE"; 67 1.1 christos case CL_INVALID_CONTEXT: 68 1.1 christos return "CL_INVALID_CONTEXT"; 69 1.1 christos case CL_INVALID_QUEUE_PROPERTIES: 70 1.1 christos return "CL_INVALID_QUEUE_PROPERTIES"; 71 1.1 christos case CL_INVALID_COMMAND_QUEUE: 72 1.1 christos return "CL_INVALID_COMMAND_QUEUE"; 73 1.1 christos case CL_INVALID_HOST_PTR: 74 1.1 christos return "CL_INVALID_HOST_PTR"; 75 1.1 christos case CL_INVALID_MEM_OBJECT: 76 1.1 christos return "CL_INVALID_MEM_OBJECT"; 77 1.1 christos case CL_INVALID_IMAGE_FORMAT_DESCRIPTOR: 78 1.1 christos return "CL_INVALID_IMAGE_FORMAT_DESCRIPTOR"; 79 1.1 christos case CL_INVALID_IMAGE_SIZE: 80 1.1 christos return "CL_INVALID_IMAGE_SIZE"; 81 1.1 christos case CL_INVALID_SAMPLER: 82 1.1 christos return "CL_INVALID_SAMPLER"; 83 1.1 christos case CL_INVALID_BINARY: 84 1.1 christos return "CL_INVALID_BINARY"; 85 1.1 christos case CL_INVALID_BUILD_OPTIONS: 86 1.1 christos return "CL_INVALID_BUILD_OPTIONS"; 87 1.1 christos case CL_INVALID_PROGRAM: 88 1.1 christos return "CL_INVALID_PROGRAM"; 89 1.1 christos case CL_INVALID_PROGRAM_EXECUTABLE: 90 1.1 christos return "CL_INVALID_PROGRAM_EXECUTABLE"; 91 1.1 christos case CL_INVALID_KERNEL_NAME: 92 1.1 christos return "CL_INVALID_KERNEL_NAME"; 93 1.1 christos case CL_INVALID_KERNEL_DEFINITION: 94 1.1 christos return "CL_INVALID_KERNEL_DEFINITION"; 95 1.1 christos case CL_INVALID_KERNEL: 96 1.1 christos return "CL_INVALID_KERNEL"; 97 1.1 christos case CL_INVALID_ARG_INDEX: 98 1.1 christos return "CL_INVALID_ARG_INDEX"; 99 1.1 christos case CL_INVALID_ARG_VALUE: 100 1.1 christos return "CL_INVALID_ARG_VALUE"; 101 1.1 christos case CL_INVALID_ARG_SIZE: 102 1.1 christos return "CL_INVALID_ARG_SIZE"; 103 1.1 christos case CL_INVALID_KERNEL_ARGS: 104 1.1 christos return "CL_INVALID_KERNEL_ARGS"; 105 1.1 christos case CL_INVALID_WORK_DIMENSION: 106 1.1 christos return "CL_INVALID_WORK_DIMENSION"; 107 1.1 christos case CL_INVALID_WORK_GROUP_SIZE: 108 1.1 christos return "CL_INVALID_WORK_GROUP_SIZE"; 109 1.1 christos case CL_INVALID_WORK_ITEM_SIZE: 110 1.1 christos return "CL_INVALID_WORK_ITEM_SIZE"; 111 1.1 christos case CL_INVALID_GLOBAL_OFFSET: 112 1.1 christos return "CL_INVALID_GLOBAL_OFFSET"; 113 1.1 christos case CL_INVALID_EVENT_WAIT_LIST: 114 1.1 christos return "CL_INVALID_EVENT_WAIT_LIST"; 115 1.1 christos case CL_INVALID_EVENT: 116 1.1 christos return "CL_INVALID_EVENT"; 117 1.1 christos case CL_INVALID_OPERATION: 118 1.1 christos return "CL_INVALID_OPERATION"; 119 1.1 christos case CL_INVALID_GL_OBJECT: 120 1.1 christos return "CL_INVALID_GL_OBJECT"; 121 1.1 christos case CL_INVALID_BUFFER_SIZE: 122 1.1 christos return "CL_INVALID_BUFFER_SIZE"; 123 1.1 christos case CL_INVALID_MIP_LEVEL: 124 1.1 christos return "CL_INVALID_MIP_LEVEL"; 125 1.1 christos #ifndef CL_PLATFORM_NVIDIA 126 1.1 christos case CL_INVALID_GLOBAL_WORK_SIZE: 127 1.1 christos return "CL_INVALID_GLOBAL_WORK_SIZE"; 128 1.1 christos #endif 129 1.1 christos default: 130 1.1 christos return "Unknown"; 131 1.1 christos }; 132 1.1 christos } 133 1.1 christos 134 1.1 christos 135 1.1 christos void print_clinfo () 136 1.1 christos { 137 1.1 christos char *s = NULL; 138 1.1 christos size_t len; 139 1.1 christos unsigned i, j; 140 1.1 christos cl_uint platform_count; 141 1.1 christos cl_platform_id *platforms; 142 1.1 christos 143 1.1 christos /* Determine number of OpenCL Platforms available. */ 144 1.1 christos clGetPlatformIDs (0, NULL, &platform_count); 145 1.1 christos printf ("number of OpenCL Platforms available:\t%d\n", platform_count); 146 1.1 christos /* Get platforms. */ 147 1.1 christos platforms 148 1.1 christos = (cl_platform_id*) malloc (sizeof (cl_platform_id) * platform_count); 149 1.1 christos if (platforms == NULL) 150 1.1 christos { 151 1.1 christos fprintf (stderr, "malloc failed\n"); 152 1.1 christos exit (EXIT_FAILURE); 153 1.1 christos } 154 1.1 christos clGetPlatformIDs (platform_count, platforms, NULL); 155 1.1 christos 156 1.1 christos /* Querying platforms. */ 157 1.1 christos for (i = 0; i < platform_count; i++) 158 1.1 christos { 159 1.1 christos cl_device_id *devices; 160 1.1 christos cl_uint device_count; 161 1.1 christos cl_device_id default_dev; 162 1.1 christos printf (" OpenCL Platform: %d\n", i); 163 1.1 christos 164 1.1 christos #define PRINT_PF_INFO(PARM)\ 165 1.1 christos clGetPlatformInfo (platforms[i], PARM, 0, NULL, &len); \ 166 1.1 christos s = realloc (s, len); \ 167 1.1 christos clGetPlatformInfo (platforms[i], PARM, len, s, NULL); \ 168 1.1 christos printf (" %-36s%s\n", #PARM ":", s); 169 1.1 christos 170 1.1 christos PRINT_PF_INFO (CL_PLATFORM_PROFILE) 171 1.1 christos PRINT_PF_INFO (CL_PLATFORM_VERSION) 172 1.1 christos PRINT_PF_INFO (CL_PLATFORM_NAME) 173 1.1 christos PRINT_PF_INFO (CL_PLATFORM_VENDOR) 174 1.1 christos PRINT_PF_INFO (CL_PLATFORM_EXTENSIONS) 175 1.1 christos #undef PRINT_PF_INFO 176 1.1 christos 177 1.1 christos clGetDeviceIDs (platforms[i], CL_DEVICE_TYPE_DEFAULT, 1, &default_dev, 178 1.1 christos NULL); 179 1.1 christos clGetDeviceInfo (default_dev, CL_DEVICE_NAME, 0, NULL, &len); 180 1.1 christos s = realloc (s, len); 181 1.1 christos clGetDeviceInfo (default_dev, CL_DEVICE_NAME, len, s, NULL); 182 1.1 christos printf (" CL_DEVICE_TYPE_DEFAULT: %s\n", s); 183 1.1 christos 184 1.1 christos /* Determine number of devices. */ 185 1.1 christos clGetDeviceIDs (platforms[i], CL_DEVICE_TYPE_ALL, 0, NULL, &device_count); 186 1.1 christos printf ("\n number of OpenCL Devices available: %d\n", device_count); 187 1.1 christos /* Get devices. */ 188 1.1 christos devices = (cl_device_id*) malloc (sizeof (cl_device_id) * device_count); 189 1.1 christos if (devices == NULL) 190 1.1 christos { 191 1.1 christos fprintf (stderr, "malloc failed\n"); 192 1.1 christos exit (EXIT_FAILURE); 193 1.1 christos } 194 1.1 christos clGetDeviceIDs (platforms[i], CL_DEVICE_TYPE_ALL, device_count, devices, 195 1.1 christos NULL); 196 1.1 christos 197 1.1 christos /* Querying devices. */ 198 1.1 christos for (j = 0; j < device_count; j++) 199 1.1 christos { 200 1.1 christos cl_device_type dtype; 201 1.1 christos cl_device_mem_cache_type mctype; 202 1.1 christos cl_device_local_mem_type mtype; 203 1.1 christos cl_device_fp_config fpcfg; 204 1.1 christos cl_device_exec_capabilities xcap; 205 1.1 christos cl_command_queue_properties qprops; 206 1.1 christos cl_bool clbool; 207 1.1 christos cl_uint cluint; 208 1.1 christos cl_ulong clulong; 209 1.1 christos size_t sizet; 210 1.1 christos size_t workitem_size[3]; 211 1.1 christos printf (" OpenCL Device: %d\n", j); 212 1.1 christos 213 1.1 christos #define PRINT_DEV_INFO(PARM)\ 214 1.1 christos clGetDeviceInfo (devices[j], PARM, 0, NULL, &len); \ 215 1.1 christos s = realloc (s, len); \ 216 1.1 christos clGetDeviceInfo (devices[j], PARM, len, s, NULL); \ 217 1.1 christos printf (" %-41s%s\n", #PARM ":", s); 218 1.1 christos 219 1.1 christos PRINT_DEV_INFO (CL_DEVICE_NAME) 220 1.1 christos PRINT_DEV_INFO (CL_DRIVER_VERSION) 221 1.1 christos PRINT_DEV_INFO (CL_DEVICE_VENDOR) 222 1.1 christos clGetDeviceInfo (devices[j], CL_DEVICE_VENDOR_ID, sizeof (cluint), 223 1.1 christos &cluint, NULL); 224 1.1 christos printf (" CL_DEVICE_VENDOR_ID: %d\n", cluint); 225 1.1 christos 226 1.1 christos clGetDeviceInfo (devices[j], CL_DEVICE_TYPE, sizeof (dtype), &dtype, NULL); 227 1.1 christos if (dtype & CL_DEVICE_TYPE_CPU) 228 1.1 christos printf (" CL_DEVICE_TYPE: CL_DEVICE_TYPE_CPU\n"); 229 1.1 christos if (dtype & CL_DEVICE_TYPE_GPU) 230 1.1 christos printf (" CL_DEVICE_TYPE: CL_DEVICE_TYPE_GPU\n"); 231 1.1 christos if (dtype & CL_DEVICE_TYPE_ACCELERATOR) 232 1.1 christos printf (" CL_DEVICE_TYPE: CL_DEVICE_TYPE_ACCELERATOR\n"); 233 1.1 christos if (dtype & CL_DEVICE_TYPE_DEFAULT) 234 1.1 christos printf (" CL_DEVICE_TYPE: CL_DEVICE_TYPE_DEFAULT\n"); 235 1.1 christos 236 1.1 christos clGetDeviceInfo (devices[j], CL_DEVICE_MAX_CLOCK_FREQUENCY, sizeof (cluint), &cluint, NULL); 237 1.1 christos printf (" CL_DEVICE_MAX_CLOCK_FREQUENCY: %d\n", cluint); 238 1.1 christos 239 1.1 christos PRINT_DEV_INFO (CL_DEVICE_PROFILE) 240 1.1 christos PRINT_DEV_INFO (CL_DEVICE_EXTENSIONS) 241 1.1 christos 242 1.1 christos clGetDeviceInfo (devices[j], CL_DEVICE_AVAILABLE, sizeof (clbool), &clbool, NULL); 243 1.1 christos if (clbool == CL_TRUE) 244 1.1 christos printf (" CL_DEVICE_AVAILABLE: CL_TRUE\n"); 245 1.1 christos else 246 1.1 christos printf (" CL_DEVICE_AVAILABLE: CL_FALSE\n"); 247 1.1 christos clGetDeviceInfo (devices[j], CL_DEVICE_ENDIAN_LITTLE, sizeof (clbool), &clbool, NULL); 248 1.1 christos if (clbool == CL_TRUE) 249 1.1 christos printf (" CL_DEVICE_ENDIAN_LITTLE: CL_TRUE\n"); 250 1.1 christos else 251 1.1 christos printf (" CL_DEVICE_ENDIAN_LITTLE: CL_FALSE\n"); 252 1.1 christos 253 1.1 christos clGetDeviceInfo (devices[j], CL_DEVICE_MAX_COMPUTE_UNITS, sizeof (cluint), &cluint, NULL); 254 1.1 christos printf (" CL_DEVICE_MAX_COMPUTE_UNITS: %d\n", cluint); 255 1.1 christos clGetDeviceInfo (devices[j], CL_DEVICE_MAX_WORK_GROUP_SIZE, sizeof (sizet), &sizet, NULL); 256 1.1 christos printf (" CL_DEVICE_MAX_WORK_GROUP_SIZE: %d\n", sizet); 257 1.1 christos clGetDeviceInfo (devices[j], CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS, sizeof (cluint), &cluint, NULL); 258 1.1 christos printf (" CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS: %d\n", cluint); 259 1.1 christos clGetDeviceInfo (devices[j], CL_DEVICE_MAX_WORK_ITEM_SIZES, sizeof (workitem_size), &workitem_size, NULL); 260 1.1 christos printf (" CL_DEVICE_MAX_WORK_ITEM_SIZES: %d / %d / %d\n", workitem_size[0], workitem_size[1], workitem_size[2]); 261 1.1 christos 262 1.1 christos clGetDeviceInfo (devices[j], CL_DEVICE_ADDRESS_BITS, sizeof (cluint), &cluint, NULL); 263 1.1 christos printf (" CL_DEVICE_ADDRESS_BITS: %d\n", cluint); 264 1.1 christos 265 1.1 christos clGetDeviceInfo (devices[j], CL_DEVICE_MAX_MEM_ALLOC_SIZE, sizeof (clulong), &clulong, NULL); 266 1.1 christos printf (" CL_DEVICE_MAX_MEM_ALLOC_SIZE: %llu\n", clulong); 267 1.1 christos clGetDeviceInfo (devices[j], CL_DEVICE_MEM_BASE_ADDR_ALIGN, sizeof (cluint), &cluint, NULL); 268 1.1 christos printf (" CL_DEVICE_MEM_BASE_ADDR_ALIGN: %d\n", cluint); 269 1.1 christos clGetDeviceInfo(devices[j], CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE, sizeof (cluint), &cluint, NULL); 270 1.1 christos printf (" CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE: %d\n", cluint); 271 1.1 christos clGetDeviceInfo(devices[j], CL_DEVICE_MAX_PARAMETER_SIZE, sizeof (sizet), &sizet, NULL); 272 1.1 christos printf (" CL_DEVICE_MAX_PARAMETER_SIZE: %d\n", sizet); 273 1.1 christos clGetDeviceInfo(devices[j], CL_DEVICE_GLOBAL_MEM_SIZE, sizeof (clulong), &clulong, NULL); 274 1.1 christos printf (" CL_DEVICE_GLOBAL_MEM_SIZE: %llu\n", clulong); 275 1.1 christos 276 1.1 christos clGetDeviceInfo (devices[j], CL_DEVICE_GLOBAL_MEM_CACHE_TYPE, sizeof (mctype), &mctype, NULL); 277 1.1 christos if (mctype & CL_NONE) 278 1.1 christos printf (" CL_DEVICE_GLOBAL_MEM_CACHE_TYPE: CL_NONE\n"); 279 1.1 christos if (mctype & CL_READ_ONLY_CACHE) 280 1.1 christos printf (" CL_DEVICE_GLOBAL_MEM_CACHE_TYPE: CL_READ_ONLY_CACHE\n"); 281 1.1 christos if (mctype & CL_READ_WRITE_CACHE) 282 1.1 christos printf (" CL_DEVICE_GLOBAL_MEM_CACHE_TYPE: CL_READ_WRITE_CACHE\n"); 283 1.1 christos 284 1.1 christos clGetDeviceInfo (devices[j], CL_DEVICE_GLOBAL_MEM_CACHE_SIZE, sizeof (clulong), &clulong, NULL); 285 1.1 christos printf (" CL_DEVICE_GLOBAL_MEM_CACHE_SIZE: %llu\n", clulong); 286 1.1 christos clGetDeviceInfo (devices[j], CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE, sizeof (cluint), &cluint, NULL); 287 1.1 christos printf (" CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE: %d\n", cluint); 288 1.1 christos 289 1.1 christos clGetDeviceInfo (devices[j], CL_DEVICE_LOCAL_MEM_TYPE, sizeof (mtype), &mtype, NULL); 290 1.1 christos if (mtype & CL_LOCAL) 291 1.1 christos printf (" CL_DEVICE_LOCAL_MEM_TYPE: CL_LOCAL\n"); 292 1.1 christos if (mtype & CL_GLOBAL) 293 1.1 christos printf (" CL_DEVICE_LOCAL_MEM_TYPE: CL_GLOBAL\n"); 294 1.1 christos 295 1.1 christos clGetDeviceInfo (devices[j], CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE, sizeof (cluint), &cluint, NULL); 296 1.1 christos printf (" CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE: %d\n", cluint); 297 1.1 christos clGetDeviceInfo (devices[j], CL_DEVICE_MEM_BASE_ADDR_ALIGN, sizeof (cluint), &cluint, NULL); 298 1.1 christos printf (" CL_DEVICE_MEM_BASE_ADDR_ALIGN: %d\n", cluint); 299 1.1 christos clGetDeviceInfo (devices[j], CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR, sizeof (cluint), &cluint, NULL); 300 1.1 christos printf (" CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR: %d\n", cluint); 301 1.1 christos clGetDeviceInfo (devices[j], CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT, sizeof (cluint), &cluint, NULL); 302 1.1 christos printf (" CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT: %d\n", cluint); 303 1.1 christos clGetDeviceInfo (devices[j], CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT, sizeof (cluint), &cluint, NULL); 304 1.1 christos printf (" CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT: %d\n", cluint); 305 1.1 christos clGetDeviceInfo (devices[j], CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG, sizeof (cluint), &cluint, NULL); 306 1.1 christos printf (" CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG: %d\n", cluint); 307 1.1 christos clGetDeviceInfo (devices[j], CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT, sizeof (cluint), &cluint, NULL); 308 1.1 christos printf (" CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT: %d\n", cluint); 309 1.1 christos clGetDeviceInfo (devices[j], CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE, sizeof (cluint), &cluint, NULL); 310 1.1 christos printf (" CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE: %d\n", cluint); 311 1.1 christos 312 1.1 christos clGetDeviceInfo (devices[j], CL_DEVICE_SINGLE_FP_CONFIG, sizeof (fpcfg), &fpcfg, NULL); 313 1.1 christos if (fpcfg & CL_FP_DENORM) 314 1.1 christos printf (" CL_DEVICE_SINGLE_FP_CONFIG: CL_FP_DENORM\n"); 315 1.1 christos if (fpcfg & CL_FP_INF_NAN) 316 1.1 christos printf (" CL_DEVICE_SINGLE_FP_CONFIG: CL_FP_INF_NAN\n"); 317 1.1 christos if (fpcfg & CL_FP_ROUND_TO_NEAREST) 318 1.1 christos printf (" CL_DEVICE_SINGLE_FP_CONFIG: CL_FP_ROUND_TO_NEAREST\n"); 319 1.1 christos if (fpcfg & CL_FP_ROUND_TO_ZERO) 320 1.1 christos printf (" CL_DEVICE_SINGLE_FP_CONFIG: CL_FP_ROUND_TO_ZERO\n"); 321 1.1 christos 322 1.1 christos clGetDeviceInfo (devices[j], CL_DEVICE_EXECUTION_CAPABILITIES, sizeof (xcap), &xcap, NULL); 323 1.1 christos if (xcap & CL_EXEC_KERNEL ) 324 1.1 christos printf (" CL_DEVICE_EXECUTION_CAPABILITIES: CL_EXEC_KERNEL\n"); 325 1.1 christos if (xcap & CL_EXEC_NATIVE_KERNEL) 326 1.1 christos printf (" CL_DEVICE_EXECUTION_CAPABILITIES: CL_EXEC_NATIVE_KERNEL\n"); 327 1.1 christos 328 1.1 christos clGetDeviceInfo (devices[j], CL_DEVICE_QUEUE_PROPERTIES, sizeof (qprops), &qprops, NULL); 329 1.1 christos if (qprops & CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE) 330 1.1 christos printf (" CL_DEVICE_QUEUE_PROPERTIES: CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE\n"); 331 1.1 christos if (qprops & CL_QUEUE_PROFILING_ENABLE) 332 1.1 christos printf (" CL_DEVICE_QUEUE_PROPERTIES: CL_QUEUE_PROFILING_ENABLE\n"); 333 1.1 christos 334 1.1 christos clGetDeviceInfo (devices[j], CL_DEVICE_PROFILING_TIMER_RESOLUTION, sizeof (sizet), &sizet, NULL); 335 1.1 christos printf (" CL_DEVICE_PROFILING_TIMER_RESOLUTION: %d\n", sizet); 336 1.1 christos 337 1.1 christos clGetDeviceInfo (devices[j], CL_DEVICE_COMPILER_AVAILABLE, sizeof (clbool), &clbool, NULL); 338 1.1 christos if (clbool == CL_TRUE) 339 1.1 christos printf (" CL_DEVICE_COMPILER_AVAILABLE: CL_TRUE\n"); 340 1.1 christos else 341 1.1 christos printf (" CL_DEVICE_COMPILER_AVAILABLE: CL_FALSE\n"); 342 1.1 christos clGetDeviceInfo (devices[j], CL_DEVICE_ERROR_CORRECTION_SUPPORT, sizeof (clbool), &clbool, NULL); 343 1.1 christos if (clbool == CL_TRUE) 344 1.1 christos printf (" CL_DEVICE_ERROR_CORRECTION_SUPPORT: CL_TRUE\n"); 345 1.1 christos else 346 1.1 christos printf (" CL_DEVICE_ERROR_CORRECTION_SUPPORT: CL_FALSE\n"); 347 1.1 christos 348 1.1 christos clGetDeviceInfo (devices[j], CL_DEVICE_IMAGE_SUPPORT, sizeof (clbool), &clbool, NULL); 349 1.1 christos if (clbool == CL_FALSE) 350 1.1 christos { 351 1.1 christos printf (" CL_DEVICE_IMAGE_SUPPORT: CL_FALSE\n"); 352 1.1 christos } 353 1.1 christos else 354 1.1 christos { 355 1.1 christos printf (" CL_DEVICE_IMAGE_SUPPORT: CL_TRUE\n"); 356 1.1 christos clGetDeviceInfo (devices[j], CL_DEVICE_MAX_SAMPLERS, sizeof (cluint), &cluint, NULL); 357 1.1 christos printf (" CL_DEVICE_MAX_SAMPLERS: %d\n", cluint); 358 1.1 christos clGetDeviceInfo (devices[j], CL_DEVICE_MAX_READ_IMAGE_ARGS, sizeof (cluint), &cluint, NULL); 359 1.1 christos printf (" CL_DEVICE_MAX_READ_IMAGE_ARGS: %d\n", cluint); 360 1.1 christos clGetDeviceInfo (devices[j], CL_DEVICE_MAX_WRITE_IMAGE_ARGS, sizeof (cluint), &cluint, NULL); 361 1.1 christos printf (" CL_DEVICE_MAX_WRITE_IMAGE_ARGS: %d\n", cluint); 362 1.1 christos clGetDeviceInfo (devices[j], CL_DEVICE_IMAGE2D_MAX_WIDTH, sizeof (sizet), &sizet, NULL); 363 1.1 christos printf (" CL_DEVICE_IMAGE2D_MAX_WIDTH: %d\n", sizet); 364 1.1 christos clGetDeviceInfo (devices[j], CL_DEVICE_IMAGE2D_MAX_HEIGHT, sizeof (sizet), &sizet, NULL); 365 1.1 christos printf (" CL_DEVICE_IMAGE2D_MAX_HEIGHT: %d\n", sizet); 366 1.1 christos clGetDeviceInfo (devices[j], CL_DEVICE_IMAGE3D_MAX_WIDTH, sizeof (sizet), &sizet, NULL); 367 1.1 christos printf (" CL_DEVICE_IMAGE3D_MAX_WIDTH: %d\n", sizet); 368 1.1 christos clGetDeviceInfo (devices[j], CL_DEVICE_IMAGE3D_MAX_HEIGHT, sizeof (sizet), &sizet, NULL); 369 1.1 christos printf (" CL_DEVICE_IMAGE3D_MAX_HEIGHT: %d\n", sizet); 370 1.1 christos clGetDeviceInfo (devices[j], CL_DEVICE_IMAGE3D_MAX_DEPTH, sizeof (sizet), &sizet, NULL); 371 1.1 christos printf (" CL_DEVICE_IMAGE3D_MAX_DEPTH: %d\n", sizet); 372 1.1 christos } 373 1.1 christos #undef PRINT_DEV_INFO 374 1.1 christos } /* devices */ 375 1.1 christos free (devices); 376 1.1 christos } /* platforms */ 377 1.1 christos free (s); 378 1.1 christos free (platforms); 379 1.1 christos } 380 1.1 christos 381 1.1 christos 382 1.1 christos const char * 383 1.1 christos read_file (const char * const filename, size_t *size) 384 1.1 christos { 385 1.1 christos char *buf = NULL; 386 1.1 christos FILE *fd; 387 1.1 christos struct stat st; 388 1.1 christos if (stat (filename, &st) == -1) 389 1.1 christos { 390 1.1 christos /* Check if the file exists. */ 391 1.1 christos if (errno == ENOENT) 392 1.1 christos return buf; 393 1.1 christos perror ("stat failed"); 394 1.1 christos exit (EXIT_FAILURE); 395 1.1 christos } 396 1.1 christos buf = (char *) malloc (st.st_size); 397 1.1 christos if (buf == NULL) 398 1.1 christos { 399 1.1 christos fprintf (stderr, "malloc failed\n"); 400 1.1 christos exit (EXIT_FAILURE); 401 1.1 christos } 402 1.1 christos fd = fopen (filename, "r"); 403 1.1 christos if (fd == NULL) 404 1.1 christos { 405 1.1 christos perror ("fopen failed"); 406 1.1 christos free (buf); 407 1.1 christos exit (EXIT_FAILURE); 408 1.1 christos } 409 1.1 christos if (fread (buf, st.st_size, 1, fd) != 1) 410 1.1 christos { 411 1.1 christos fprintf (stderr, "fread failed\n"); 412 1.1 christos free (buf); 413 1.1 christos fclose (fd); 414 1.1 christos exit (EXIT_FAILURE); 415 1.1 christos } 416 1.1 christos fclose (fd); 417 1.1 christos *size = st.st_size; 418 1.1 christos return buf; 419 1.1 christos } 420 1.1 christos 421 1.1 christos 422 1.1 christos void 423 1.1 christos save_program_binaries (cl_program program) 424 1.1 christos { 425 1.1 christos cl_device_id *devices; 426 1.1 christos cl_uint device_count; 427 1.1 christos size_t *sizes; 428 1.1 christos unsigned char **binaries; 429 1.1 christos unsigned i, j; 430 1.1 christos 431 1.1 christos /* Query the amount of devices for the given program. */ 432 1.1 christos CHK (clGetProgramInfo (program, CL_PROGRAM_NUM_DEVICES, sizeof (cl_uint), 433 1.1 christos &device_count, NULL)); 434 1.1 christos 435 1.1 christos /* Get the sizes of the binaries. */ 436 1.1 christos sizes = (size_t*) malloc (sizeof (size_t) * device_count); 437 1.1 christos if (sizes == NULL) 438 1.1 christos { 439 1.1 christos fprintf (stderr, "malloc failed\n"); 440 1.1 christos exit (EXIT_FAILURE); 441 1.1 christos } 442 1.1 christos CHK (clGetProgramInfo (program, CL_PROGRAM_BINARY_SIZES, sizeof (sizes), 443 1.1 christos sizes, NULL)); 444 1.1 christos 445 1.1 christos /* Get the binaries. */ 446 1.1 christos binaries 447 1.1 christos = (unsigned char **) malloc (sizeof (unsigned char *) * device_count); 448 1.1 christos if (binaries == NULL) 449 1.1 christos { 450 1.1 christos fprintf (stderr, "malloc failed\n"); 451 1.1 christos exit (EXIT_FAILURE); 452 1.1 christos } 453 1.1 christos for (i = 0; i < device_count; i++) 454 1.1 christos { 455 1.1 christos binaries[i] = (unsigned char *) malloc (sizes[i]); 456 1.1 christos if (binaries[i] == NULL) 457 1.1 christos { 458 1.1 christos fprintf (stderr, "malloc failed\n"); 459 1.1 christos exit (EXIT_FAILURE); 460 1.1 christos } 461 1.1 christos } 462 1.1 christos CHK (clGetProgramInfo (program, CL_PROGRAM_BINARIES, sizeof (binaries), 463 1.1 christos binaries, NULL)); 464 1.1 christos 465 1.1 christos /* Get the devices for the given program to extract the file names. */ 466 1.1 christos devices = (cl_device_id*) malloc (sizeof (cl_device_id) * device_count); 467 1.1 christos if (devices == NULL) 468 1.1 christos { 469 1.1 christos fprintf (stderr, "malloc failed\n"); 470 1.1 christos exit (EXIT_FAILURE); 471 1.1 christos } 472 1.1 christos CHK (clGetProgramInfo (program, CL_PROGRAM_DEVICES, sizeof (devices), 473 1.1 christos devices, NULL)); 474 1.1 christos 475 1.1 christos for (i = 0; i < device_count; i++) 476 1.1 christos { 477 1.1 christos FILE *fd; 478 1.1 christos char *dev_name = NULL; 479 1.1 christos size_t len; 480 1.1 christos CHK (clGetDeviceInfo (devices[i], CL_DEVICE_NAME, 0, NULL, &len)); 481 1.1 christos dev_name = malloc (len); 482 1.1 christos if (dev_name == NULL) 483 1.1 christos { 484 1.1 christos fprintf (stderr, "malloc failed\n"); 485 1.1 christos exit (EXIT_FAILURE); 486 1.1 christos } 487 1.1 christos CHK (clGetDeviceInfo (devices[i], CL_DEVICE_NAME, len, dev_name, NULL)); 488 1.1 christos /* Convert spaces to underscores. */ 489 1.1 christos for (j = 0; j < strlen (dev_name); j++) 490 1.1 christos { 491 1.1 christos if (dev_name[j] == ' ') 492 1.1 christos dev_name[j] = '_'; 493 1.1 christos } 494 1.1 christos 495 1.1 christos /* Save the binaries. */ 496 1.1 christos printf ("saving program binary for device: %s\n", dev_name); 497 1.1 christos /* Save binaries[i]. */ 498 1.1 christos fd = fopen (dev_name, "w"); 499 1.1 christos if (fd == NULL) 500 1.1 christos { 501 1.1 christos perror ("fopen failed"); 502 1.1 christos exit (EXIT_FAILURE); 503 1.1 christos } 504 1.1 christos if (fwrite (binaries[i], sizes[i], 1, fd) != 1) 505 1.1 christos { 506 1.1 christos fprintf (stderr, "fwrite failed\n"); 507 1.1 christos for (j = i; j < device_count; j++) 508 1.1 christos free (binaries[j]); 509 1.1 christos fclose (fd); 510 1.1 christos exit (EXIT_FAILURE); 511 1.1 christos } 512 1.1 christos fclose (fd); 513 1.1 christos free (binaries[i]); 514 1.1 christos free (dev_name); 515 1.1 christos free (sizes); 516 1.1 christos } 517 1.1 christos free (devices); 518 1.1 christos free (binaries); 519 1.1 christos } 520