9 个版本

0.3.5 2021 年 1 月 13 日
0.3.4 2021 年 1 月 13 日
0.2.1 2021 年 1 月 12 日
0.1.0 2021 年 1 月 12 日

#4 in #ocl

每月 37 次下载

Apache-2.0

18KB
370

Rust OpenCL 流式执行器

这个crate提供对OpenCL执行的抽象,以允许结果的流式传输。这个crate不直接提供对ocl crate的抽象,但允许使用提供的流式执行器来优化执行过程。

用法

use crate::executor::OCLStreamExecutor;
use ocl::ProQue;

fn main() {
    // create the ProQue
    let pro_que = ProQue::builder()
        .src("
            __kernel void bench_int(const uint limit, __global int *NUMBERS) {
                uint id = get_global_id(0);
                int num = NUMBERS[id];
                for (int i = 0; i < limit; i++) {
                    num += i;
                }
                NUMBERS[id] = num;
            }",
        )
        .dims(1)
        .build()
        .unwrap();
    
    // create the executor
    let stream_executor = OCLStreamExecutor::new(pro_que);

    // execute a closure that provides the results in the given stream
    let mut stream = stream_executor.execute_unbound(|ctx| {
        let pro_que = ctx.pro_que();
        let tx = ctx.sender();
        let input_buffer = pro_que.buffer_builder().len(100).fill_val(0u32).build()?;

        let kernel = pro_que
            .kernel_builder("bench_int")
            .arg(100)
            .arg(&input_buffer)
            .global_work_size(100)
            .build()?;
        unsafe {
            kernel.enq()?;
        }

        let mut result = vec![0u32; 100];
        input_buffer.read(&mut result).enq()?;

        for num in result {
            // send the results to the receiving thread
            tx.send(num)?;
        }

        Ok(())
    });

    let mut count = 0;

    // calculate the expected result values
    let num = (99f32.powf(2.0) + 99f32) / 2f32;
    // read the results from the stream
    while let Ok(n) = stream.next() {
        assert_eq!(n, num as u32);
        count += 1;
    }
    assert_eq!(count, 100)
}

依赖

~4MB
~72K SLoC