diff options
| -rw-r--r-- | main.cu | 50 |
1 files changed, 48 insertions, 2 deletions
@@ -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 |
