diff --git a/schemsearch-ocl-matcher/src/lib.rs b/schemsearch-ocl-matcher/src/lib.rs index 4c860a6..967c858 100644 --- a/schemsearch-ocl-matcher/src/lib.rs +++ b/schemsearch-ocl-matcher/src/lib.rs @@ -1,3 +1,4 @@ +use std::sync::OnceLock; use ocl::{Buffer, MemFlags, ProQue, Platform}; use ocl::SpatialDims::Three; use schemsearch_common::{Match, SearchBehavior}; @@ -5,6 +6,8 @@ use math::round::ceil; const KERNEL: &str = include_str!("kernel.cl"); +static PRO_QUEU_CELL: OnceLock = OnceLock::new(); + pub fn ocl_available() -> bool { !Platform::list().is_empty() } @@ -40,10 +43,15 @@ fn search_ocl( let skip_amount = ceil((pattern_blocks * (1.0 - search_behavior.threshold)) as f64, 0) as i32; - let pro_que = ProQue::builder() - .src(KERNEL) - .dims(Three(schem_width, schem_height, schem_length)) - .build()?; + let cell = &PRO_QUEU_CELL; + let mut pro_que = cell.get_or_init(|| { + ProQue::builder() + .src(KERNEL) + .build().unwrap() + }).clone(); + + + pro_que.set_dims(Three(schem_width, schem_height, schem_length)); let buffer = Buffer::builder() .queue(pro_que.queue().clone())