ocl
文档 | 更新日志
为 Rust 提供的纯 OpenCL™ 绑定和接口。
目标
提供:
- 简单直观的 OpenCL 设备接口
- OpenCL API 的全部功能和强大性能
- 最少的样板代码
- 零或几乎为零的性能开销
- 线程安全和自动管理的 API 指针和资源
使用方法
确保你的平台已安装 OpenCL 库,并且 clinfo
或其他诊断命令可以运行。在项目的 Cargo.toml
中添加以下内容:
[dependencies]
ocl = "0.19"
然后在你的 crate 根目录(lib.rs 或 main.rs)中添加以下内容:
extern crate ocl;
示例
来自 [examples/trivial.rs
]:
extern crate ocl;
use ocl::ProQue;
fn trivial() -> ocl::Result<()> {
let src = r#"
__kernel void add(__global float* buffer, float scalar) {
buffer[get_global_id(0)] += scalar;
}
"#;
let pro_que = ProQue::builder()
.src(src)
.dims(1 << 20)
.build()?;
let buffer = pro_que.create_buffer::<f32>()?;
let kernel = pro_que.kernel_builder("add")
.arg(&buffer)
.arg(10.0f32)
.build()?;
unsafe { kernel.enq()?; }
let mut vec = vec![0.0f32; buffer.len()];
buffer.read(&mut vec).enq()?;
println!("索引 [{}] 处的值现在是 '{}'!", 200007, vec[200007]);
Ok(())
}
查看 [examples/trivial.rs
] 的其余部分,了解更多关于这个库如何利用 Rust 的零成本抽象,在简单的包装中提供 C API 的全部功能和性能。
最近的变更
- 0.18.0:现在创建
Kernel
需要使用新的KernelBuilder
。更多信息请参阅更新日志。
OpenCL 简介
如需快速但全面地了解 OpenCL 基础知识,请查看 Matthew Scarpino 在 drdobbs.com 上发表的精彩文章 "OpenCL 温和入门"(他的书也很棒)。
深入探索
已经熟悉标准 OpenCL 核心 API 了吗?查看 [ocl-core
] crate,以传统 API 风格访问完整的功能集,同时享受 Rust 的安全性和便利性。
版本支持
支持 OpenCL 1.1 及以上版本。由于固有的线程不安全性,不支持 OpenCL 1.0 版本。
Vulkan™ 和未来
OpenCL API 已经具备 Vulkan API 的所有新特性,如低开销、高性能和不受限制的硬件访问。实际上,Vulkan 可以说是 OpenCL 功能的图形专注型超集(差不多是这样)。OpenCL 2.1+ 和 Vulkan 内核/着色器现在都编译成 SPIR-V,使得设备端的东西变得一致。我不会感到惊讶,如果大多数驱动程序供应商以相同的方式实现这两个主机 API。
将来,这两者可能会完全合并(或者 Vulkan 会吸收 OpenCL)。无论发生什么,就这个库的前端而言,什么都不会改变。这个库将继续专注于计算方面。
许可证
根据以下两种许可之一授权:
- Apache License, Version 2.0, (LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
由你选择。
贡献
除非你另有明确声明,否则你有意提交以包含在作品中的任何贡献,按照 Apache-2.0 许可证的定义,应按上述方式双重许可,无需任何额外条款或条件。
"OpenCL 和 OpenCL 标志是苹果公司的商标,经 Khronos 许可使用。"
"Vulkan 和 Vulkan 标志是 Khronos Group Inc. 的商标。"