LSLab
set_kernels.h
1 #include <thrust/device_vector.h>
2 #include <cuda.h>
3 #include <cuda/std/utility>
4 
5 #pragma once
6 
7 namespace lslab {
8 namespace set_kernels {
9 
10 template<int block_size, typename map_t, typename K>
11 __global__ void remove_(map_t map, const K* keys, bool* output, size_t size) {
12 
13  int tidx = threadIdx.x;
14  int bidx = blockIdx.x;
15 
16  K key;
17  if(tidx + bidx * block_size < size) {
18  key = keys[tidx + bidx * block_size];
19  }
20 
21  bool res = map.remove(key, tidx + bidx * block_size < size);
22 
23  if(tidx + bidx * block_size < size) {
24  output[tidx + bidx * block_size] = res;
25  }
26 }
27 
28 template<int block_size, typename map_t, typename K>
29 __global__ void contains_(map_t map, const K* keys, bool* output, size_t size) {
30 
31  int tidx = threadIdx.x;
32  int bidx = blockIdx.x;
33 
34  K key;
35  if(tidx + bidx * block_size < size) {
36  key = keys[tidx + bidx * block_size];
37  }
38 
39  bool res = map.contains(key, tidx + bidx * block_size < size);
40 
41  if(tidx + bidx * block_size < size) {
42  output[tidx + bidx * block_size] = res;
43  }
44 }
45 
46 
47 template<int block_size, typename map_t, typename K>
48 __global__ void insert_(map_t map, const K* keys, bool* output, size_t size) {
49 
50  int tidx = threadIdx.x;
51  int bidx = blockIdx.x;
52 
53  K key;
54  if(tidx + bidx * block_size < size) {
55  key = keys[tidx + bidx * block_size];
56  }
57 
58  bool res = map.insert(key, tidx + bidx * block_size < size);
59  if(tidx + bidx * block_size < size) {
60  output[tidx + bidx * block_size] = res;
61  }
62 
63 }
64 
65 }
66 }