0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-09-28 19:58:53 +02:00

ircd:🆑 Split out init subs; add semver parse for device api.

This commit is contained in:
Jason Volk 2021-10-03 15:28:27 -07:00
parent a04cc3c290
commit 183ff2138f
2 changed files with 85 additions and 23 deletions

View file

@ -246,8 +246,14 @@ struct ircd::cl::exec::opts
bool sync {false};
};
struct ircd::cl::init
class ircd::cl::init
{
size_t init_platforms();
size_t init_devices();
size_t init_pipes();
void fini_pipes();
public:
init();
~init() noexcept;
};

View file

@ -10,6 +10,7 @@
#include <dlfcn.h>
#include <CL/cl.h>
#include <CL/cl_ext.h>
// Util
namespace ircd::cl
@ -48,6 +49,12 @@ namespace ircd::cl
static cl_device_id
device[PLATFORM_MAX][DEVICE_MAX];
static struct version
{
int major, minor;
}
api[PLATFORM_MAX][DEVICE_MAX];
static cl_context
primary;
@ -223,15 +230,54 @@ ircd::cl::init::init()
if(!(linkage = dlopen("libOpenCL.so", RTLD_LAZY | RTLD_GLOBAL)))
return;
// Get the platforms.
init_platforms();
// Report the platforms.
log_platform_info();
// Get the devices.
init_devices();
// Report the devices.
log_dev_info();
// Various other inits.
init_pipes();
}
ircd::cl::init::~init()
noexcept
{
if(!linkage)
return;
const ctx::posix::enable_pthread enable_pthread;
log::debug
{
log, "Shutting down OpenCL...",
};
fini_pipes();
dlclose(linkage);
}
size_t
ircd::cl::init::init_platforms()
{
// OpenCL sez platform=null is implementation defined.
info(clGetPlatformInfo, nullptr, CL_PLATFORM_VERSION, version_abi.string);
// Get the platforms.
call(clGetPlatformIDs, PLATFORM_MAX, platform, &platforms);
// Report the platforms.
log_platform_info();
return platforms;
}
size_t
ircd::cl::init::init_devices()
{
// Get the devices.
size_t devices_total(0);
for(size_t i(0); i < platforms; ++i)
{
@ -244,6 +290,31 @@ ircd::cl::init::init()
devices_total += devices[i];
}
// Gather the API versions for the devices.
for(size_t i(0); i < platforms; ++i)
for(size_t j(0); j < devices[i]; ++j)
{
// OpenCL sez:
// OpenCL<space><major_version.minor_version><space><vendor-specific information>
string_view ver; char buf[32];
ver = info(clGetDeviceInfo, device[i][j], CL_DEVICE_VERSION, buf);
ver = lstrip(ver, "OpenCL ");
ver = split(ver, ' ').first;
const auto &[major, minor]
{
split(ver, '.')
};
api[i][j].major = lex_cast<uint>(major);
api[i][j].minor = lex_cast<uint>(minor);
}
return devices_total;
}
size_t
ircd::cl::init::init_pipes()
{
// Gather all devices we'll use.
size_t _devs {0};
cl_device_id _dev[DEVICE_MAX];
@ -257,9 +328,6 @@ ircd::cl::init::init()
primary = clCreateContext(&ctxprop, _devs, _dev, handle_notify, nullptr, &err);
throw_on_error(err);
// Dump device details to infolog
log_dev_info();
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
@ -287,28 +355,18 @@ ircd::cl::init::init()
throw_on_error(err);
}
#pragma GCC diagnostic pop
// For any inits in the work subsystem.
work::init();
#pragma GCC diagnostic pop
return _devs;
}
ircd::cl::init::~init()
noexcept
void
ircd::cl::init::fini_pipes()
{
if(!linkage)
return;
const ctx::posix::enable_pthread enable_pthread;
if(primary)
{
log::debug
{
log, "Shutting down OpenCL...",
};
work::fini();
}
for(size_t i(0); i < PLATFORM_MAX; ++i)
for(size_t j(0); j < DEVICE_MAX; ++j)
@ -323,8 +381,6 @@ noexcept
call(clReleaseContext, primary);
primary = nullptr;
}
dlclose(linkage);
}
void