5个版本
0.0.5 | 2024年5月23日 |
---|---|
0.0.4 | 2024年5月23日 |
0.0.3 | 2024年5月22日 |
0.0.2 | 2024年5月22日 |
0.0.1 | 2024年5月22日 |
#303 in 硬件支持
138 每月下载量
18KB
318 行
ocl-macros
文档 | 变更日志
简化/加速与ocl crate协同工作的宏。ocl-macros 目前支持 rust 宏,以便轻松创建 ocl::Kernel 和 ocl::Buffer。
此crate仍处于早期开发阶段。
功能
- 一行内创建简单的内核。
- 轻松指定多个内核参数,可以是命名的或未命名的
- 一行内创建缓冲区
用法
如果您想与 ocl 一起使用 ocl-macros,请将以下内容添加到您的 Cargo.toml
[dependencies]
ocl-macros = "0.0.4"
通过将以下内容添加到项目的根目录中,将宏导入到您的项目中
use ocl_macros::*;
示例
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);
此代码使用各种宏创建一个新的缓冲区和内核,将创建的缓冲区作为未命名的参数。然后执行内核。将缓冲区内容读入新的向量并验证。它已从 0.0 变为 1.0!
许可证
此crate受MIT许可证或Apache-2.0许可证的许可。
贡献
欢迎贡献!根据Apache-2.0许可证定义,您有意提交的任何贡献,均应双重许可如上所述,不得附加任何额外条款或条件。
依赖关系
~3MB
~54K SLoC