Home | History | Annotate | Line # | Download | only in lib
      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