diff options
Diffstat (limited to 'src/solvers/gpu/mod.rs')
-rw-r--r-- | src/solvers/gpu/mod.rs | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/src/solvers/gpu/mod.rs b/src/solvers/gpu/mod.rs new file mode 100644 index 0000000..f9ab711 --- /dev/null +++ b/src/solvers/gpu/mod.rs @@ -0,0 +1,56 @@ +pub mod host; +pub mod manager; +pub mod output; + +pub use manager::*; + +type MaskMessage = (u64, Vec<u64>); +type RowMessage = (u64, Vec<Vec<u32>>); + +pub enum Message { + CheckRequest(CheckRequest), + HostMessage(MaskMessage), + OutputMessage(RowMessage), + Terminate, +} + +pub struct ResultMessage { + data: Vec<u64>, + offset: usize, + size: usize, +} + +impl ResultMessage { + fn new(data: Vec<u64>, offset: usize, size: usize) -> Self { + Self { data, offset, size } + } + fn valid_walls(&self, wg_size: usize) -> &[Vec<u32>] { + let mut result = vec![Vec::new(); wg_size]; + for (j, r) in self.data.iter().enumerate() { + for b in 0..64 { + if r & (1 << b) != 0 { + let permutation = j / self.size + self.offset; + let instruction = (j % self.size) * 64 + b; + result[instruction].push(permutation as u32); + } + } + } + result.as_ref() + } +} + +pub struct CheckRequest { + rows: Vec<u32>, + bitmask: u64, + queue: u32, +} + +impl CheckRequest { + pub fn new(rows: Vec<u32>, bitmask: u64, queue: u32) -> Self { + Self { + rows, + bitmask, + queue, + } + } +} |