30个版本 (19个重大更新)
0.19.7 | 2024年3月27日 |
---|---|
0.19.6 | 2023年11月9日 |
0.19.5 | 2023年10月9日 |
0.19.4 | 2022年8月23日 |
0.2.0 | 2015年11月19日 |
#18 in 科学
4,640 每月下载量
用于 43 个Crates (35 个直接使用)
1MB
22K SLoC
ocl
为Rust提供的纯OpenCL™绑定和接口。
目标
提供
- 一个简单直观的OpenCL设备接口
- OpenCL API的完整功能和力量
- 极少的模板代码
- 零或几乎零的性能开销
- 线程安全和自动管理API指针和资源
使用
确保您的平台已安装OpenCL库,并且clinfo
或某些其他诊断命令可以运行。将以下内容添加到您的项目Cargo.toml
[dependencies]
ocl = "0.19"
并将以下内容添加到您的crate根目录(lib.rs或main.rs)
extern crate ocl;
示例
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!("The value at index [{}] is now '{}'!", 200007, vec[200007]);
Ok(())
}
有关此库如何利用Rust的无成本抽象提供简单包装中的C API的全部功能和性能的更多信息,请参阅examples/trivial.rs
的其余部分。
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,版本 2.0,(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 https://open-source.org.cn/licenses/MIT)
由您选择。
贡献
除非您明确表示,否则根据 Apache-2.0 许可证定义的,您有意提交以包含在工作中的任何贡献,都应按照上述方式双重许可,不附加任何额外的条款或条件。
“OpenCL 和 OpenCL 标志是苹果公司的商标,由 Khronos 授权使用。”
“Vulkan 和 Vulkan 标志是 Khronos Group Inc. 的商标。”
依赖项
~1.2–1.9MB
~32K SLoC