summaryrefslogtreecommitdiff
path: root/src/solvers/gpu/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/solvers/gpu/mod.rs')
-rw-r--r--src/solvers/gpu/mod.rs56
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,
+ }
+ }
+}