1- // ===- dpctl_sycl_program_interface.cpp - Implements C API for sycl::program =//
1+ // ===- dpctl_sycl_program_interface.cpp - Implements C API for
2+ // sycl::kernel_bundle<sycl::bundle_state::executable> =//
23//
34// Data Parallel Control (dpctl)
45//
@@ -63,6 +64,35 @@ static const int clLibLoadFlags = 0;
6364#error "OpenCL program compilation is unavailable for this platform"
6465#endif
6566
67+ constexpr backend cl_be = backend::opencl;
68+
69+ struct cl_loader
70+ {
71+ public:
72+ static cl_loader &get ()
73+ {
74+ static cl_loader _loader;
75+ return _loader;
76+ }
77+
78+ template <typename retTy> retTy getSymbol (const char *name)
79+ {
80+ if (!opened) {
81+ error_handler (" The OpenCL loader dynamic library could not "
82+ " be opened." ,
83+ __FILE__, __func__, __LINE__);
84+
85+ return nullptr ;
86+ }
87+ return clLib.getSymbol <retTy>(name);
88+ }
89+
90+ private:
91+ dpctl::DynamicLibHelper clLib;
92+ bool opened;
93+ cl_loader () : clLib(clLoaderName, clLibLoadFlags), opened(clLib.opened()) {}
94+ };
95+
6696typedef cl_program (*clCreateProgramWithSourceFT)(cl_context,
6797 cl_uint,
6898 const char **,
@@ -71,16 +101,8 @@ typedef cl_program (*clCreateProgramWithSourceFT)(cl_context,
71101const char *clCreateProgramWithSource_Name = " clCreateProgramWithSource" ;
72102clCreateProgramWithSourceFT get_clCreateProgramWithSource ()
73103{
74- static dpctl::DynamicLibHelper clLib (clLoaderName, clLibLoadFlags);
75- if (!clLib.opened ()) {
76- error_handler (" The OpenCL loader dynamic library could not "
77- " be opened." ,
78- __FILE__, __func__, __LINE__);
79- return nullptr ;
80- }
81-
82104 static auto st_clCreateProgramWithSourceF =
83- clLib .getSymbol <clCreateProgramWithSourceFT>(
105+ cl_loader::get () .getSymbol <clCreateProgramWithSourceFT>(
84106 clCreateProgramWithSource_Name);
85107
86108 return st_clCreateProgramWithSourceF;
@@ -93,15 +115,9 @@ typedef cl_program (*clCreateProgramWithILFT)(cl_context,
93115const char *clCreateProgramWithIL_Name = " clCreateProgramWithIL" ;
94116clCreateProgramWithILFT get_clCreateProgramWithIL ()
95117{
96- static dpctl::DynamicLibHelper clLib (clLoaderName, clLibLoadFlags);
97- if (!clLib.opened ()) {
98- error_handler (" The OpenCL loader dynamic library could not "
99- " be opened." ,
100- __FILE__, __func__, __LINE__);
101- return nullptr ;
102- }
103118 static auto st_clCreateProgramWithILF =
104- clLib.getSymbol <clCreateProgramWithILFT>(clCreateProgramWithIL_Name);
119+ cl_loader::get ().getSymbol <clCreateProgramWithILFT>(
120+ clCreateProgramWithIL_Name);
105121
106122 return st_clCreateProgramWithILF;
107123}
@@ -114,15 +130,8 @@ typedef cl_int (*clBuildProgramFT)(cl_program,
114130const char *clBuildProgram_Name = " clBuildProgram" ;
115131clBuildProgramFT get_clBuldProgram ()
116132{
117- static dpctl::DynamicLibHelper clLib (clLoaderName, clLibLoadFlags);
118- if (!clLib.opened ()) {
119- error_handler (" The OpenCL loader dynamic library could not "
120- " be opened." ,
121- __FILE__, __func__, __LINE__);
122- return nullptr ;
123- }
124133 static auto st_clBuildProgramF =
125- clLib .getSymbol <clBuildProgramFT>(clBuildProgram_Name);
134+ cl_loader::get () .getSymbol <clBuildProgramFT>(clBuildProgram_Name);
126135
127136 return st_clBuildProgramF;
128137}
@@ -183,8 +192,6 @@ std::string _GetErrorCode_ocl_impl(cl_int code)
183192 std::to_string (static_cast <int >(code)) + " )" ;
184193}
185194
186- constexpr backend cl_be = backend::opencl;
187-
188195DPCTLSyclKernelBundleRef
189196_CreateKernelBundle_common_ocl_impl (cl_program clProgram,
190197 const context &ctx,
@@ -354,6 +361,33 @@ static const int zeLibLoadFlags = 0;
354361
355362constexpr sycl::backend ze_be = sycl::backend::ext_oneapi_level_zero;
356363
364+ struct ze_loader
365+ {
366+ public:
367+ static ze_loader &get ()
368+ {
369+ static ze_loader _loader;
370+ return _loader;
371+ }
372+
373+ template <typename retTy> retTy getSymbol (const char *name)
374+ {
375+ if (!opened) {
376+ error_handler (" The Level-Zero loader dynamic library could not "
377+ " be opened." ,
378+ __FILE__, __func__, __LINE__);
379+
380+ return nullptr ;
381+ }
382+ return zeLib.getSymbol <retTy>(name);
383+ }
384+
385+ private:
386+ dpctl::DynamicLibHelper zeLib;
387+ bool opened;
388+ ze_loader () : zeLib(zeLoaderName, zeLibLoadFlags), opened(zeLib.opened()) {}
389+ };
390+
357391typedef ze_result_t (*zeModuleCreateFT)(ze_context_handle_t ,
358392 ze_device_handle_t ,
359393 const ze_module_desc_t *,
@@ -362,15 +396,8 @@ typedef ze_result_t (*zeModuleCreateFT)(ze_context_handle_t,
362396const char *zeModuleCreate_Name = " zeModuleCreate" ;
363397zeModuleCreateFT get_zeModuleCreate ()
364398{
365- static dpctl::DynamicLibHelper zeLib (zeLoaderName, zeLibLoadFlags);
366- if (!zeLib.opened ()) {
367- error_handler (" The level zero loader dynamic library could not "
368- " be opened." ,
369- __FILE__, __func__, __LINE__);
370- return nullptr ;
371- }
372399 static auto st_zeModuleCreateF =
373- zeLib .getSymbol <zeModuleCreateFT>(zeModuleCreate_Name);
400+ ze_loader::get () .getSymbol <zeModuleCreateFT>(zeModuleCreate_Name);
374401
375402 return st_zeModuleCreateF;
376403}
@@ -379,15 +406,8 @@ typedef ze_result_t (*zeModuleDestroyFT)(ze_module_handle_t);
379406const char *zeModuleDestroy_Name = " zeModuleDestroy" ;
380407zeModuleDestroyFT get_zeModuleDestroy ()
381408{
382- static dpctl::DynamicLibHelper zeLib (zeLoaderName, zeLibLoadFlags);
383- if (!zeLib.opened ()) {
384- error_handler (" The level zero loader dynamic library could not "
385- " be opened." ,
386- __FILE__, __func__, __LINE__);
387- return nullptr ;
388- }
389409 static auto st_zeModuleDestroyF =
390- zeLib .getSymbol <zeModuleDestroyFT>(zeModuleDestroy_Name);
410+ ze_loader::get () .getSymbol <zeModuleDestroyFT>(zeModuleDestroy_Name);
391411
392412 return st_zeModuleDestroyF;
393413}
@@ -398,15 +418,8 @@ typedef ze_result_t (*zeKernelCreateFT)(ze_module_handle_t,
398418const char *zeKernelCreate_Name = " zeKernelCreate" ;
399419zeKernelCreateFT get_zeKernelCreate ()
400420{
401- static dpctl::DynamicLibHelper zeLib (zeLoaderName, zeLibLoadFlags);
402- if (!zeLib.opened ()) {
403- error_handler (" The level zero loader dynamic library could not "
404- " be opened." ,
405- __FILE__, __func__, __LINE__);
406- return nullptr ;
407- }
408421 static auto st_zeKernelCreateF =
409- zeLib .getSymbol <zeKernelCreateFT>(zeKernelCreate_Name);
422+ ze_loader::get () .getSymbol <zeKernelCreateFT>(zeKernelCreate_Name);
410423
411424 return st_zeKernelCreateF;
412425}
0 commit comments