Crates.io | ocl-macros |
lib.rs | ocl-macros |
version | 0.0.5 |
source | src |
created_at | 2024-05-22 16:16:34.837653 |
updated_at | 2024-05-23 16:56:38.039369 |
description | Macros for easier/faster working with the ocl crate |
homepage | |
repository | https://github.com/PipInSpace/ocl-macros |
max_upload_size | |
id | 1248102 |
size | 19,721 |
Macros for easier/faster working with the ocl crate. ocl-macros currently supports rust macros for easy ocl::Kernel and ocl::Buffer creation.
This crate is still in early development.
If you want to use ocl-macros with ocl, add the following to your Cargo.toml
:
[dependencies]
ocl-macros = "0.0.4"
Import the macros into your project by adding the following to your project's root:
use ocl_macros::*;
Example use of ocl-macros:
use ocl::{Context, Device, Platform, Program, Queue};
use ocl_macros::*;
let PROGRAM_SRC: &str = r#"
kernel void add_one(global float* var) {
const uint n = get_global_id(0);
// This program adds 1.0f to each element in the buffer
var[n] += 1.0f;
}
"#;
// Initialize OpenCL context/queue
let platform = Platform::default();
// Get first device on default platform
let device = default_device!();
let context = Context::builder()
.platform(platform)
.devices(device)
.build()
.unwrap();
let queue = Queue::new(&context, device, None).unwrap();
let program = Program::builder()
.devices(device)
.src(PROGRAM_SRC)
.build(&context)
.unwrap();
// Create new float buffer with 100 elements of starting value 0.0f32
let buffer = buffer!(&queue, 100, 0.0f32);
// Create the "add_one" kernel with work size 100 and buffer as first unnamed argument
let kernel = kernel!(program, queue, "add_one", 100, &buffer);
// Run kernel (This is unsafe)
unsafe { kernel.enq().unwrap(); }
// Get buffer content as new vector
let vec = bget!(buffer);
// The elements are now 1.0f32!
assert!(vec[0] == 1.0f32);
This code uses various macros to create a new buffer and kernel with the created buffer as an unnamed argument. The kernel is then executed. The buffer content is read into a new vector and verified. It has changed from 0.0 to 1.0!
This crate is licensed under the MIT license or the Apache-2.0 license.
Contributions are welcome! Any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.