#include "gpu/intel/ocl/hw_info.hpp"
#include "gpu/intel/ocl/utils.hpp"
#include "gpu/intel/jit/binary_format.hpp"
#include "gpu/intel/jit/generator.hpp"
#include "gpu/intel/jit/utils/type_bridge.hpp"
#ifndef CL_DEVICE_IP_VERSION_INTEL
#define CL_DEVICE_IP_VERSION_INTEL 0x4250
#endif
namespace dnnl {
namespace impl {
namespace gpu {
namespace intel {
namespace ocl {
xpu::runtime_version_t get_driver_version(cl_device_id device) {
cl_int err;
xpu::runtime_version_t runtime_version(-1, -1, -1);
size_t param_size = 0;
err = xpu::ocl::clGetDeviceInfo(
device, CL_DRIVER_VERSION, 0, nullptr, ¶m_size);
std::string driver_version(param_size, '\0');
if (err == CL_SUCCESS) {
err = xpu::ocl::clGetDeviceInfo(device, CL_DRIVER_VERSION, param_size,
&driver_version[0], nullptr);
}
if (err != CL_SUCCESS
|| runtime_version.set_from_string(&driver_version[0])
!= status::success) {
runtime_version.major = 0;
runtime_version.minor = 0;
runtime_version.build = 0;
}
return runtime_version;
}
status_t init_gpu_hw_info(impl::engine_t *engine, cl_device_id device,
cl_context ctx, uint32_t &ip_version, compute::gpu_arch_t &gpu_arch,
compute::gpu_product_t &product_, uint64_t &native_extensions,
bool &mayiuse_systolic, bool &mayiuse_ngen_kernels,
bool &is_efficient_64bit) {
using namespace ngen;
ngen::Product product
= ngen::OpenCLCodeGenerator<HW::Unknown>::detectHWInfo(ctx, device);
HW hw = getCore(product.family);
bool is_xelpg = (product.family == ngen::ProductFamily::ARL
|| product.family == ngen::ProductFamily::MTL);
gpu_arch = jit::convert_ngen_arch_to_dnnl(ngen::getCore(product.family));
std::memcpy(&product_, &product, sizeof(ngen::Product));
mayiuse_systolic = false;
CHECK(get_ocl_device_enabled_systolic_intel(device, mayiuse_systolic));
CHECK(get_ocl_device_enabled_native_float_atomics(
device, native_extensions, is_xelpg));
if (hw <= ngen::HW::Xe3) {
auto status = jit::gpu_supports_binary_format(
&mayiuse_ngen_kernels, engine);
if (status != status::success) {
VWARN(common, runtime,
"ngen fallback (gpu does not support binary format "
"kernels)");
mayiuse_ngen_kernels = false;
}
} else if (hw != ngen::HW::Unknown)
mayiuse_ngen_kernels = true;
is_efficient_64bit = OpenCLCodeGenerator<HW::Unknown>::detectEfficient64Bit(
ctx, device, hw);
ip_version = 0;
OCL_CHECK(xpu::ocl::clGetDeviceInfo(device, CL_DEVICE_IP_VERSION_INTEL,
sizeof(ip_version), &ip_version, nullptr));
return status::success;
}
} } } } }