summaryrefslogtreecommitdiff
path: root/main.cu
diff options
context:
space:
mode:
Diffstat (limited to 'main.cu')
-rw-r--r--main.cu50
1 files changed, 48 insertions, 2 deletions
diff --git a/main.cu b/main.cu
index bef698c..411dd9d 100644
--- a/main.cu
+++ b/main.cu
@@ -456,6 +456,7 @@ __device__ bool LockFreeSkipList::Add(LL key) {
}
}
// size_ += 1;
+ // this->key_map.insert(MapNode(ll, newNode));
atomicAdd(&size_, 1);
return true;
}
@@ -528,6 +529,43 @@ LL Randomlevel(std::mt19937 &randomEngine) {
return std::min(MAX_LEVEL, (size_t)distribution(randomEngine) + 1);
}
+std::vector<LL> storage;
+
+unsigned trailing_zeroes(LL n) {
+ unsigned bits = 0;
+ LL x = n;
+
+ if (x) {
+ while ((x & 1) == 0) {
+ ++bits;
+ x >>= 1;
+ }
+ }
+ return bits;
+}
+
+constexpr int block_size = 8;
+
+LL CustomLevel(LL value) {
+ auto left = std::lower_bound(storage.begin(), storage.end(), value);
+ auto right = std::upper_bound(storage.begin(), storage.end(), value);
+
+ if (right - left != 1) {
+ printf("%ld\n", right - left);
+ }
+ assert(right - left == 1);
+
+ auto index = left - storage.begin();
+
+ if (index % block_size == 0) {
+ auto level = trailing_zeroes(index / block_size + 1) + 1;
+ // printf("%ld %u\n", index, level);
+ return level;
+ }
+
+ return 1;
+}
+
__global__ void print_function() { printf("size: %u\n", l->size_); }
int main(int argc, char **argv) {
@@ -541,6 +579,8 @@ int main(int argc, char **argv) {
long adds = strtol(argv[1], nullptr, 10);
long deletes = strtol(argv[2], nullptr, 10);
+ storage.reserve(NUM_ITEMS);
+
if (adds + deletes > 100) {
printf("Sum of add and delete percentages exceeds 100.\nAborting...\n");
exit(1);
@@ -558,14 +598,19 @@ int main(int argc, char **argv) {
std::random_device randomDevice;
std::mt19937 randomEngine(randomDevice());
- std::uniform_int_distribution<int> uniformIntDistributionArray(0, NUM_ITEMS);
+ std::uniform_int_distribution<int> uniformIntDistributionArray(0,
+ NUM_ITEMS - 1);
+ // std::vector<LL> storage;
for (i = 0; i < NUM_ITEMS; i++) {
items[i] = i + 3; // 10+rand()%KEYS;
// Keys associated with
// operations
+ storage.push_back(i + 3);
}
+ std::sort(storage.begin(), storage.end());
+
for (i = 0; i < NUM_ITEMS; i++) {
/*int first = rand() % NUM_ITEMS;
int second = rand() % NUM_ITEMS;*/
@@ -581,7 +626,8 @@ int main(int argc, char **argv) {
// Pre-generated levels of skip list nodes (relevant only if op[i] is add)
// srand(0);
for (i = 0; i < NUM_ITEMS; i++) {
- levels[i] = Randomlevel(randomEngine) - 1;
+ // levels[i] = Randomlevel(randomEngine) - 1; //36/14
+ levels[i] = CustomLevel(items[i]) - 1; // 31/18
}
// Populate the sequence of operations