extern crate ocl;
#[macro_use]
extern crate colorify;
use ocl::core::{OclPrm, ProgramInfo};
use ocl::{
Buffer, Context, Device, Event, EventList, Image, Kernel, Platform, Program, Queue,
Result as OclResult, Sampler,
};
const PRINT_DETAILED: bool = true;
const PRINT_DETAILED_DEVICE: bool = false;
const PRINT_DETAILED_PROGRAM: bool = false;
static TAB: &'static str = " ";
static SRC: &'static str = r#"
__kernel void multiply(__global float* buffer, float coeff) {
buffer[get_global_id(0)] *= coeff;
}
"#;
fn info() -> OclResult<()> {
let dims = 2048;
let platforms = Platform::list();
println!("Looping through avaliable platforms ({}):", platforms.len());
for p_idx in 0..platforms.len() {
let platform = &platforms[p_idx];
let devices = Device::list_all(platform)?;
if devices.is_empty() {
continue;
}
let context = Context::builder()
.platform(platform.clone())
.devices(&devices)
.build()?;
print_platform_info(&platform)?;
for device in devices.iter() {
print_device_info(device)?;
}
for d_idx in 0..devices.len() {
let device = devices[d_idx];
let queue = Queue::new(&context, device, Some(ocl::core::QUEUE_PROFILING_ENABLE))?;
let buffer = Buffer::<f32>::builder()
.queue(queue.clone())
.len(dims)
.build()?;
let image = Image::<u8>::builder()
.dims(dims)
.queue(queue.clone())
.build()?;
let sampler = Sampler::with_defaults(&context)?;
let program = Program::builder()
.src(SRC)
.devices(device)
.build(&context)?;
let kernel = Kernel::builder()
.name("multiply")
.program(&program)
.queue(queue.clone())
.global_work_size(dims)
.arg(&buffer)
.arg(10.0f32)
.build()?;
let mut event_list = EventList::new();
unsafe {
kernel.cmd().enew(&mut event_list).enq()?;
}
event_list.wait_for()?;
let mut event = Event::empty();
buffer
.cmd()
.write(&vec![0.0; dims])
.enew(&mut event)
.enq()?;
event.wait_for()?;
if d_idx == 0 {
print_context_info(&context);
print_queue_info(&queue);
print_buffer_info(&buffer);
print_image_info(&image);
print_sampler_info(&sampler);
print_program_info(&program)?;
print_kernel_info(&kernel);
print_event_list_info(&event_list);
print_event_info(&event);
}
}
}
Ok(())
}
fn print_platform_info(platform: &Platform) -> OclResult<()> {
printc!(blue: "{}", platform);
let devices = Device::list_all(platform)?;
printc!(blue: " {{ Total Device Count: {} }}", devices.len());
print!("\n");
Ok(())
}
fn print_device_info(device: &Device) -> OclResult<()> {
if PRINT_DETAILED_DEVICE {
printlnc!(teal: "{}", device);
} else {
if !PRINT_DETAILED {
print!("{t}", t = TAB);
}
printlnc!(teal: "Device (terse) {{ Name: {}, Vendor: {} }}", device.name()?,
device.vendor()?);
}
Ok(())
}
fn print_context_info(context: &Context) {
printlnc!(purple: "{}", context);
}
fn print_queue_info(queue: &Queue) {
printlnc!(lime: "{}", queue);
}
fn print_buffer_info<T: OclPrm>(buffer: &Buffer<T>) {
printlnc!(royal_blue: "{}", buffer);
}
fn print_image_info<S: OclPrm>(image: &Image<S>) {
printlnc!(peach: "{}", image);
}
fn print_sampler_info(sampler: &Sampler) {
printlnc!(cyan: "{}", sampler);
}
fn print_program_info(program: &Program) -> OclResult<()> {
if PRINT_DETAILED_PROGRAM {
printlnc!(magenta: "{}", program);
} else {
if !PRINT_DETAILED {
print!("{t}{t}", t = TAB);
}
printlnc!(magenta: "Program (terse) {{ KernelNames: '{}', NumDevices: {}, ReferenceCount: {}, Context: {} }}",
program.info(ProgramInfo::KernelNames)?,
program.info(ProgramInfo::NumDevices)?,
program.info(ProgramInfo::ReferenceCount)?,
program.info(ProgramInfo::Context)?,
);
}
Ok(())
}
fn print_kernel_info(kernel: &Kernel) {
printlnc!(green: "{}", kernel);
}
fn print_event_list_info(event_list: &EventList) {
printlnc!(orange: "{:?}", event_list);
}
fn print_event_info(event: &Event) {
printlnc!(yellow: "{}", event);
}
pub fn main() {
match info() {
Ok(_) => (),
Err(err) => println!("{}", err),
}
}