#ocl #opencl #macro

ocl-macros

简化/加速与ocl crate协同工作的宏

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 硬件支持

Download history 389/week @ 2024-05-21

138 每月下载量

MIT/Apache

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