/* * 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; } // // //