use obwio::*;
use crate::runtime::Env;
use std::ffi::CString;
use crate::data::Buffer;
use std::ffi::c_void;
pub fn setarg(env: &Env, buffer: &Buffer, arg: usize) {
unsafe {
let size = std::mem::size_of::<cl_mem>();
let buf_ptr: *const std::ffi::c_void = &buffer.buffer as *const _ as *const _;
clSetKernelArg(env.kernel, arg as u32, size, buf_ptr as *const _);
if env.err != 0 {
panic!("OpenCL error: {}", env.err);
}
}
}
pub fn get_devices() {
unsafe {
let mut num_platforms = 0;
clGetPlatformIDs(0, std::ptr::null_mut(), &mut num_platforms);
let mut platforms = vec![std::ptr::null_mut(); num_platforms as usize];
clGetPlatformIDs(num_platforms, platforms.as_mut_ptr(), std::ptr::null_mut());
for (p_idx, &platform) in platforms.iter().enumerate() {
println!("Platform {}:", p_idx);
let mut num_devices = 0;
clGetDeviceIDs(platform, CL_DEVICE_TYPE_ALL.into(), 0, std::ptr::null_mut(), &mut num_devices);
let mut devices = vec![std::ptr::null_mut(); num_devices as usize];
clGetDeviceIDs(platform, CL_DEVICE_TYPE_ALL.into(), num_devices, devices.as_mut_ptr(), std::ptr::null_mut());
for (d_idx, &device) in devices.iter().enumerate() {
let mut size = 0;
clGetDeviceInfo(device, CL_DEVICE_NAME, 0, std::ptr::null_mut(), &mut size);
let mut name_buf = vec![0u8; size];
clGetDeviceInfo(device, CL_DEVICE_NAME, size, name_buf.as_mut_ptr() as *mut _, std::ptr::null_mut());
let name = std::ffi::CStr::from_bytes_with_nul(&name_buf).unwrap();
println!(" Device {}: {}", d_idx, name.to_str().unwrap());
}
}
}
}
pub fn setarg_scalar<T>(env: &Env, val: &T, arg: usize) {
unsafe {
let size = std::mem::size_of::<T>();
clSetKernelArg(env.kernel, arg as u32, size, val as *const T as *const c_void);
if env.err != 0 {
panic!("OpenCL error: {}", env.err);
}
}
}
pub fn run_kernel(env: &mut Env, threads: usize) {
unsafe {
let global_work_size: [usize; 1] = [threads];
clEnqueueNDRangeKernel(
env.queue,
env.kernel,
1,
std::ptr::null(),
global_work_size.as_ptr(),
std::ptr::null(),
0,
std::ptr::null_mut(),
std::ptr::null_mut(),
);
}
}
pub fn make_kernel(env: &mut Env, name: &str) {
unsafe {
let cname = CString::new(name).unwrap();
env.kernel = clCreateKernel(env.program, cname.as_ptr(), &mut env.err);
if env.err != 0 {
panic!("OpenCL error: {}", env.err);
}
}
}