C++程序  |  210行  |  5.45 KB

/*
 * Copyright 2018 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 *
 */

//
//
//

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

//
//
//

#include "find_cl.h"
#include "assert_cl.h"
#include "../macros.h"

//
// search platforms and devices for a match
//

cl_int
clFindIdsByName(char const     * const target_platform_substring,
                char const     * const target_device_substring,
                cl_platform_id * const platform_id,
                cl_device_id   * const device_id,
                size_t           const matched_device_name_size,
                char           * const matched_device_name,
                size_t         * const matched_device_name_size_ret,
                bool             const is_verbose)
{
  bool match_platform=false, match_device=false;

  //
  // get number of platforms
  //
  cl_uint platform_count;

  cl(GetPlatformIDs(0,NULL,&platform_count));

  cl_platform_id * const platform_ids = ALLOCA_MACRO(sizeof(*platform_ids) * platform_count);

  cl(GetPlatformIDs(platform_count,platform_ids,NULL));

  //
  // search platforms
  //
  for (cl_uint ii=0; ii<platform_count; ii++)
    {
      size_t platform_name_size;

      cl(GetPlatformInfo(platform_ids[ii],
                         CL_PLATFORM_NAME,
                         0,
                         NULL,
                         &platform_name_size));

      char * const platform_name = ALLOCA_MACRO(platform_name_size);

      cl(GetPlatformInfo(platform_ids[ii],
                         CL_PLATFORM_NAME,
                         platform_name_size,
                         platform_name,
                         NULL));


      if (!match_platform && (strstr(platform_name,target_platform_substring) != NULL))
        {
          match_platform = true;
          *platform_id   = platform_ids[ii];
        }

      if (is_verbose) {
        fprintf(stdout,"%2u: %s\n",ii,platform_name);
      }

      //
      // find devices for current platform
      //
      cl_uint device_count;
      cl_int  cl_err;

      cl_err = clGetDeviceIDs(platform_ids[ii],
                              CL_DEVICE_TYPE_ALL,
                              0,
                              NULL,
                              &device_count);

      cl_device_id * const device_ids = ALLOCA_MACRO(sizeof(*device_ids) * device_count);

      cl_err = clGetDeviceIDs(platform_ids[ii],
                              CL_DEVICE_TYPE_ALL,
                              device_count,
                              device_ids,
                              NULL);

      if (cl_err != CL_DEVICE_NOT_FOUND)
        cl_ok(cl_err);

      for (cl_uint jj=0; jj<device_count; jj++)
        {
          size_t device_name_size;
          size_t driver_version_size;

          cl(GetDeviceInfo(device_ids[jj],
                           CL_DEVICE_NAME,
                           0,
                           NULL,
                           &device_name_size));

          cl(GetDeviceInfo(device_ids[jj],
                           CL_DRIVER_VERSION,
                           0,
                           NULL,
                           &driver_version_size));

          char * const device_name    = ALLOCA_MACRO(device_name_size);
          char * const driver_version = ALLOCA_MACRO(driver_version_size);

          cl(GetDeviceInfo(device_ids[jj],
                           CL_DEVICE_NAME,
                           device_name_size,
                           device_name,
                           NULL));

          cl(GetDeviceInfo(device_ids[jj],
                           CL_DRIVER_VERSION,
                           driver_version_size,
                           driver_version,
                           NULL));

          if (!match_device && match_platform && (strstr(device_name,target_device_substring) != NULL))
            {
              match_device = true;
              *device_id   = device_ids[jj];

              if (matched_device_name != NULL)
                {
                  size_t bytes = 0;

                  if (matched_device_name_size >= 1)
                    matched_device_name[matched_device_name_size-1] = 0;

                  if (matched_device_name_size > 1)
                    {
                      bytes = MIN_MACRO(device_name_size,matched_device_name_size-1);

                      memcpy(matched_device_name,device_name,bytes);
                    }

                  if (matched_device_name_size_ret != NULL)
                    *matched_device_name_size_ret = bytes;
                }

              if (is_verbose) {
                fprintf(stdout," >>>");
              }
            }
          else if (is_verbose)
            {
              fprintf(stdout,"    ");
            }

          if (is_verbose)
            {
              fprintf(stdout,
                      " %1u: %s [ %s ]\n",
                      jj,
                      device_name,
                      driver_version);
            }
        }
    }

  if (is_verbose) {
    fprintf(stdout,"\n");
  }

  //
  // get target platform and device
  //
  if (!match_platform)
    {
      if (is_verbose)
        fprintf(stderr,"no match for target platform substring %s\n",target_platform_substring);

      return CL_INVALID_PLATFORM;
    }
  if (!match_device)
    {
      if (is_verbose)
        fprintf(stderr,"no match for target device substring %s\n",target_device_substring);

      return CL_DEVICE_NOT_FOUND;
    }

  return CL_SUCCESS;
}

//
//
//