rusticl: experimental support for cl_khr_fp16

Hidden behind `RUSTICL_ENABLE=fp16` for now as the OpenCL CTS doesn't have
enough fp16 tests at the moment. There has been a lot of work on it though,
so hopefully we can enable and verify it soon.

Additionally libclc also misses a bunch of fp16 functionality, so most of
the tests would also just crash.

However this flag is useful for development as it already wires up most of
the code needed.

Signed-off-by: Karol Herbst <git@karolherbst.de>
Reviewed-by: Nora Allen <blackcatgames@protonmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23788>
This commit is contained in:
Karol Herbst
2023-06-17 22:15:58 +02:00
committed by Marge Bot
parent 6ae801c4d8
commit 29b4c1a09f
6 changed files with 36 additions and 6 deletions
+14 -3
View File
@@ -89,7 +89,14 @@ impl CLInfo<cl_device_info> for cl_device_id {
CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE => cl_prop::<cl_uint>(0),
CL_DEVICE_GLOBAL_MEM_SIZE => cl_prop::<cl_ulong>(dev.global_mem_size()),
CL_DEVICE_GLOBAL_VARIABLE_PREFERRED_TOTAL_SIZE => cl_prop::<usize>(0),
CL_DEVICE_HALF_FP_CONFIG => cl_prop::<cl_device_fp_config>(0),
CL_DEVICE_HALF_FP_CONFIG => cl_prop::<cl_device_fp_config>(
if dev.fp16_supported() {
CL_FP_ROUND_TO_NEAREST | CL_FP_INF_NAN
} else {
0
}
.into(),
),
CL_DEVICE_HOST_MEM_CAPABILITIES_INTEL => {
cl_prop::<cl_device_unified_shared_memory_capabilities_intel>(0)
}
@@ -193,7 +200,9 @@ impl CLInfo<cl_device_info> for cl_device_id {
cl_prop::<cl_uint>(if dev.fp64_supported() { 1 } else { 0 })
}
CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT => cl_prop::<cl_uint>(1),
CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF => cl_prop::<cl_uint>(0),
CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF => {
cl_prop::<cl_uint>(if dev.fp16_supported() { 1 } else { 0 })
}
CL_DEVICE_NATIVE_VECTOR_WIDTH_INT => cl_prop::<cl_uint>(1),
CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG => cl_prop::<cl_uint>(1),
CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT => cl_prop::<cl_uint>(1),
@@ -232,7 +241,9 @@ impl CLInfo<cl_device_info> for cl_device_id {
cl_prop::<cl_uint>(if dev.fp64_supported() { 1 } else { 0 })
}
CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT => cl_prop::<cl_uint>(1),
CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF => cl_prop::<cl_uint>(0),
CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF => {
cl_prop::<cl_uint>(if dev.fp16_supported() { 1 } else { 0 })
}
CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT => cl_prop::<cl_uint>(1),
CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG => cl_prop::<cl_uint>(1),
CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT => cl_prop::<cl_uint>(1),
+13 -1
View File
@@ -517,6 +517,10 @@ impl Device {
add_spirv("SPV_KHR_integer_dot_product");
add_spirv("SPV_KHR_no_integer_wrap_decoration");
if self.fp16_supported() {
add_ext(1, 0, 0, "cl_khr_fp16");
}
if self.fp64_supported() {
add_ext(1, 0, 0, "cl_khr_fp64");
add_feat(1, 0, 0, "__opencl_c_fp64");
@@ -616,6 +620,14 @@ impl Device {
res as cl_device_type
}
pub fn fp16_supported(&self) -> bool {
if !Platform::features().fp16 {
return false;
}
self.shader_param(pipe_shader_cap::PIPE_SHADER_CAP_FP16) != 0
}
pub fn fp64_supported(&self) -> bool {
if !Platform::features().fp64 {
return false;
@@ -867,7 +879,7 @@ impl Device {
pub fn cl_features(&self) -> clc_optional_features {
clc_optional_features {
fp16: false,
fp16: self.fp16_supported(),
fp64: self.fp64_supported(),
int64: self.int64_supported(),
images: self.image_supported(),
@@ -21,6 +21,7 @@ pub struct PlatformDebug {
}
pub struct PlatformFeatures {
pub fp16: bool,
pub fp64: bool,
}
@@ -55,7 +56,10 @@ static mut PLATFORM: Platform = Platform {
devs: Vec::new(),
};
static mut PLATFORM_DBG: PlatformDebug = PlatformDebug { program: false };
static mut PLATFORM_FEATURES: PlatformFeatures = PlatformFeatures { fp64: false };
static mut PLATFORM_FEATURES: PlatformFeatures = PlatformFeatures {
fp16: false,
fp64: false,
};
fn load_env() {
let debug = unsafe { &mut PLATFORM_DBG };
@@ -72,6 +76,7 @@ fn load_env() {
if let Ok(feature_flags) = env::var("RUSTICL_FEATURES") {
for flag in feature_flags.split(',') {
match flag {
"fp16" => features.fp16 = true,
"fp64" => features.fp64 = true,
_ => eprintln!("Unknown RUSTICL_FEATURES flag found: {}", flag),
}
@@ -319,6 +319,7 @@ impl SPIRVBin {
caps: spirv_supported_capabilities {
address: true,
float16: true,
float64: true,
generic_pointers: true,
int8: true,