Skip to content

Commit d096d46

Browse files
committed
work in progress version
1 parent d78c121 commit d096d46

9 files changed

Lines changed: 117 additions & 12 deletions

File tree

src/artic/core/common.art

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,8 @@ fn @permute_element(mut i: u32, l: u32, seed: u32) -> u32 {
328328
}
329329
}
330330

331-
#[import(cc = "device", name = "llvm.fma.f32")] fn fmaf(f32, f32, f32) -> f32;
331+
// #[import(cc = "device", name = "llvm.fma.f32")] fn fmaf(f32, f32, f32) -> f32;
332+
fn @fmaf(a: f32, b: f32, c: f32) = a*b+c;
332333

333334
// The following stuff is only for development purposes and should never ever be in production code
334335
#[import(cc = "device", name = "llvm.debugtrap")] fn ig_trap() -> ();

src/artic/driver/mapping_gpu.art

Lines changed: 81 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -991,14 +991,12 @@ fn @make_gpu_device( dev_id: i32
991991
ignis_load_image(filename, &mut pixel_data, &mut width, &mut height, channel_count);
992992

993993
let stride = width; // Drop mutable attribute
994-
let q = pixel_data as &addrspace(1)[f32];
994+
let q = accs(pixel_data, 0 /* Ignored */);
995995
if channel_count == 1 {
996-
make_image_mono(if is_nvvm { @ |x, y| nvvm_ldg_f32(&q(y * stride + x)) }
997-
else { @ |x, y| q(y * stride + x) },
996+
make_image_mono(@ |x, y| q.load_f32(y*stride + x),
998997
width, height)
999998
} else {
1000-
make_image_rgba32(if is_nvvm { @ |x, y| nvvm_load_vec4(q, y * stride + x) }
1001-
else { @ |x, y| amdgpu_load_vec4(q, y * stride + x) },
999+
make_image_rgba32(@ |x, y| q.load_vec4(y*stride * channel_count + x * channel_count),
10021000
width, height)
10031001
}
10041002
},
@@ -1009,14 +1007,12 @@ fn @make_gpu_device( dev_id: i32
10091007
ignis_load_image_by_id(id, &mut pixel_data, &mut width, &mut height, channel_count);
10101008

10111009
let stride = width; // Drop mutable attribute
1012-
let q = pixel_data as &addrspace(1)[f32];
1010+
let q = accs(pixel_data, 0 /* Ignored */);
10131011
if channel_count == 1 {
1014-
make_image_mono(if is_nvvm { @ |x, y| nvvm_ldg_f32(&q(y * stride + x)) }
1015-
else { @ |x, y| q(y * stride + x) },
1012+
make_image_mono(@ |x, y| q.load_f32(y*stride + x),
10161013
width, height)
10171014
} else {
1018-
make_image_rgba32(if is_nvvm { @ |x, y| nvvm_load_vec4(q, y * stride + x) }
1019-
else { @ |x, y| amdgpu_load_vec4(q, y * stride + x) },
1015+
make_image_rgba32(@ |x, y| q.load_vec4(y*stride * channel_count + x * channel_count),
10201016
width, height)
10211017
}
10221018
},
@@ -1188,3 +1184,78 @@ fn @make_amdgpu_device(dev: i32, config: RenderConfig, gpu_config: GPUKernelConf
11881184
false
11891185
)
11901186
}
1187+
1188+
#[import(cc = "device", name = "atomic_max")] fn opencl_atomic_max_global(&mut addrspace(1)i32, i32) -> i32;
1189+
#[import(cc = "device", name = "atomic_max")] fn opencl_atomic_max_shared(&mut addrspace(3)i32, i32) -> i32;
1190+
1191+
fn @make_opencl_device(dev: i32, config: RenderConfig, gpu_config: GPUKernelConfiguration) -> Device {
1192+
let dev_id = runtime_device(2, dev);
1193+
let atomics = Atomics {
1194+
add_global_i32 = @ |p, i| opencl_atomic_add_global(p as &mut addrspace(1)i32, i),
1195+
add_global_f32 = @ |p, i| opencl_atomic_add_global_f32(p as &mut addrspace(1)f32, i),
1196+
min_global_i32 = @ |p, i| opencl_atomic_min_global(p as &mut addrspace(1)i32, i),
1197+
max_global_i32 = @ |_p, _i| 0:i32, // opencl_atomic_max_global(p as &mut addrspace(1)i32, i), //< TODO
1198+
add_shared_i32 = @ |p, i| opencl_atomic_add_shared(p, i),
1199+
add_shared_f32 = @ |p, i| atomic_p3(11:u32, p, i, 2:u32, "wavefront")
1200+
};
1201+
let accessor = DeviceBufferGlobalElementAccessor {
1202+
load_f32 = @|p: &addrspace(1)[f32], i: i32| p(i),
1203+
load_i32 = @|p: &addrspace(1)[i32], i: i32| p(i),
1204+
load_vf32 = @|p: &addrspace(1)[f32], i: i32| {
1205+
let v = (p as &addrspace(1)[simd[f32 * 4]])(i);
1206+
(v(0), v(1), v(2), v(3))
1207+
},
1208+
load_vi32 = @|p: &addrspace(1)[i32], i: i32| {
1209+
let v = (p as &addrspace(1)[simd[i32 * 4]])(i);
1210+
(v(0), v(1), v(2), v(3))
1211+
}
1212+
};
1213+
1214+
make_gpu_device(
1215+
dev_id,
1216+
config,
1217+
opencl_spirv_accelerator(dev),
1218+
gpu_config,
1219+
make_default_min_max(),
1220+
@ |ptr, size| make_gpu_buffer(dev_id, ptr as &addrspace(1)[f32], size, atomics, accessor),
1221+
@ |ptr, size| make_gpu_shallow_buffer(ptr as &addrspace(1)[f32], size, accessor),
1222+
atomics,
1223+
false
1224+
)
1225+
}
1226+
1227+
// fn @make_vulkan_device(dev: i32, config: RenderConfig, gpu_config: GPUKernelConfiguration) -> Device {
1228+
// let dev_id = runtime_device(6, dev);
1229+
// let atomics = Atomics {
1230+
// add_global_i32 = @ |p, i| opencl_atomic_add_global(p as &mut addrspace(1)i32, i),
1231+
// add_global_f32 = @ |p, i| opencl_atomic_add_global_f32(p as &mut addrspace(1)f32, i),
1232+
// min_global_i32 = @ |p, i| opencl_atomic_min_global(p as &mut addrspace(1)i32, i),
1233+
// max_global_i32 = @ |p, i| opencl_atomic_max_global(p as &mut addrspace(1)i32, i),
1234+
// add_shared_i32 = @ |p, i| opencl_atomic_add_shared(p, i),
1235+
// add_shared_f32 = @ |p, i| atomic_p3(11:u32, p, i, 2:u32, "wavefront")
1236+
// };
1237+
// let accessor = DeviceBufferGlobalElementAccessor {
1238+
// load_f32 = @|p: &addrspace(1)[f32], i: i32| p(i),
1239+
// load_i32 = @|p: &addrspace(1)[i32], i: i32| p(i),
1240+
// load_vf32 = @|p: &addrspace(1)[f32], i: i32| {
1241+
// let v = (p as &addrspace(1)[simd[f32 * 4]])(i);
1242+
// (v(0), v(1), v(2), v(3))
1243+
// },
1244+
// load_vi32 = @|p: &addrspace(1)[i32], i: i32| {
1245+
// let v = (p as &addrspace(1)[simd[i32 * 4]])(i);
1246+
// (v(0), v(1), v(2), v(3))
1247+
// }
1248+
// };
1249+
1250+
// make_gpu_device(
1251+
// dev_id,
1252+
// config,
1253+
// vulkan_accelerator(dev),
1254+
// gpu_config,
1255+
// make_default_min_max(),
1256+
// @ |ptr, size| make_gpu_buffer(dev_id, ptr as &addrspace(1)[f32], size, atomics, accessor),
1257+
// @ |ptr, size| make_gpu_shallow_buffer(ptr as &addrspace(1)[f32], size, accessor),
1258+
// atomics,
1259+
// false
1260+
// )
1261+
// }

src/device/CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,9 @@ if(IG_WITH_DEVICE_GPU_AMD_HSA)
7171
list(APPEND VARIANTS hsa)
7272
endif()
7373

74+
list(APPEND VARIANTS opencl)
75+
# list(APPEND VARIANTS vulkan)
76+
7477
###########################################################
7578
set(_targets)
7679

src/device/DeviceInterface.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,10 @@ static inline int computeTargetID(const Target& target)
6565
return ANYDSL_DEVICE(ANYDSL_CUDA, (int)target.device());
6666
case GPUArchitecture::AMD_HSA:
6767
return ANYDSL_DEVICE(ANYDSL_HSA, (int)target.device());
68+
case GPUArchitecture::OpenCL:
69+
return ANYDSL_DEVICE(ANYDSL_OPENCL, (int)target.device());
70+
// case GPUArchitecture::Vulkan:
71+
// return ANYDSL_DEVICE(ANYDSL_Vulkan, (int)target.device());
6872
}
6973
}
7074

src/device/Interface.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ namespace IG {
2525
#define CLASS_NAME DeviceInterface_AMD_PAL
2626
#elif defined(IG_BUILD_DEVICE_INTEL)
2727
#define CLASS_NAME DeviceInterface_INTEL
28+
#elif defined(IG_BUILD_DEVICE_OPENCL)
29+
#define CLASS_NAME DeviceInterface_OPENCL
30+
#elif defined(IG_BUILD_DEVICE_VULKAN)
31+
#define CLASS_NAME DeviceInterface_VULKAN
2832
#else
2933
#error Unknown device architecture
3034
#endif
@@ -58,6 +62,10 @@ class CLASS_NAME : public IPluginInterface {
5862
return GPUArchitecture::AMD_PAL;
5963
#elif defined(IG_BUILD_DEVICE_INTEL)
6064
return GPUArchitecture::Intel;
65+
#elif defined(IG_BUILD_DEVICE_OPENCL)
66+
return GPUArchitecture::OpenCL;
67+
#elif defined(IG_BUILD_DEVICE_VULKAN)
68+
return GPUArchitecture::Vulkan;
6169
#else
6270
#error Unknown device architecture
6371
#endif

src/frontend/python/runtime.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,8 @@ void runtime_module(nb::module_& m)
216216
.value("AMD", GPUArchitecture::AMD_HSA)
217217
.value("Intel", GPUArchitecture::Intel)
218218
.value("Nvidia", GPUArchitecture::Nvidia)
219+
.value("OpenCL", GPUArchitecture::OpenCL)
220+
.value("Vulkan", GPUArchitecture::Vulkan)
219221
.value("Unknown", GPUArchitecture::Unknown);
220222

221223
nb::class_<Target>(m, "Target", "Target specification the runtime is using")

src/runtime/device/Target.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,10 @@ GPUArchitecture Target::getGPUArchitectureFromString(const std::string& str)
4949
return GPUArchitecture::Intel;
5050
else if (lstr == "nvidia")
5151
return GPUArchitecture::Nvidia;
52+
else if (lstr == "opencl")
53+
return GPUArchitecture::OpenCL;
54+
else if (lstr == "vulkan")
55+
return GPUArchitecture::Vulkan;
5256
else
5357
return GPUArchitecture::Unknown;
5458
}
@@ -77,6 +81,10 @@ std::string_view Target::toString(GPUArchitecture arch)
7781
return "Intel";
7882
case GPUArchitecture::Nvidia:
7983
return "Nvidia";
84+
case GPUArchitecture::OpenCL:
85+
return "OpenCL";
86+
case GPUArchitecture::Vulkan:
87+
return "Vulkan";
8088
default:
8189
case GPUArchitecture::Unknown:
8290
return "Unknown";
@@ -98,7 +106,7 @@ std::vector<std::string> Target::getAvailableCPUArchitectureNames()
98106

99107
std::vector<std::string> Target::getAvailableGPUArchitectureNames()
100108
{
101-
return { "AMD", "Intel", "Nvidia" };
109+
return { "AMD", "Intel", "Nvidia", "OpenCL", "Vulkan" };
102110
}
103111

104112
static inline CPUArchitecture getCPUArchitecture()

src/runtime/device/Target.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ enum class GPUArchitecture {
99
// AMD_PAL, // TODO
1010
Intel, // TODO: Only listed here, no support at the moment
1111
Nvidia,
12+
OpenCL,
13+
Vulkan,
1214
Unknown
1315
};
1416

src/runtime/shader/ShaderUtils.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,12 @@ std::string ShaderUtils::constructDevice(const LoaderOptions& opts)
4747
case GPUArchitecture::Nvidia:
4848
stream << "make_nvvm_device(settings.device, render_config, make_default_gpu_kernel_config());";
4949
break;
50+
case GPUArchitecture::OpenCL:
51+
stream << "make_opencl_device(settings.device, render_config, make_default_gpu_kernel_config());";
52+
break;
53+
case GPUArchitecture::Vulkan:
54+
stream << "make_vulkan_device(settings.device, render_config, make_default_gpu_kernel_config());";
55+
break;
5056
}
5157
}
5258

0 commit comments

Comments
 (0)