blob: 6c500c0865e61e729d017b4019975d8cd6e783fb [file] [log] [blame]
/*
* 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;
}
//
//
//