diff options
| author | KunoiSayami <[email protected]> | 2022-08-07 13:24:30 +0800 |
|---|---|---|
| committer | KunoiSayami <[email protected]> | 2022-08-07 13:24:30 +0800 |
| commit | f8775404ad29a669af3b2aac23dc5de866e4619f (patch) | |
| tree | 2b94f409fc0e030850d4733e2b2a1b24c5ff5e49 | |
| parent | 5e5d17b0f5d97be4c11a96a2ad2c8e10a6127832 (diff) | |
feat: Optimize binary search
Signed-off-by: KunoiSayami <[email protected]>
| -rw-r--r-- | expt_0729.cu | 2 | ||||
| -rw-r--r-- | expt_0802.cpp | 9 | ||||
| -rw-r--r-- | expt_0804.cu | 6 |
3 files changed, 7 insertions, 10 deletions
diff --git a/expt_0729.cu b/expt_0729.cu index 31aac7f..2d85a49 100644 --- a/expt_0729.cu +++ b/expt_0729.cu @@ -174,7 +174,7 @@ int main(int argc, char const *argv[]) { init<<<1, 1>>>(cudaSample, cudaPopulation); cudaDeviceSynchronize(); - dim3 grid_dim = 2, block_dim = 512; + dim3 grid_dim = 64, block_dim = 16; unsigned long step = test_size / (grid_dim.x * block_dim.x); printf("step: %lu\n", step); diff --git a/expt_0802.cpp b/expt_0802.cpp index b1a906a..7d520e2 100644 --- a/expt_0802.cpp +++ b/expt_0802.cpp @@ -25,10 +25,6 @@ size_t calculate_location(size_t index) { } typedef int key_type; -int get_son_from_step(int point, bool negative) { - return negative ? point * 2 : point * 2 + 1; -} - const key_type *cudaBinarySearch(key_type *const start, const key_type *end, const key_type val) { int step_limit = (int)std::log2(LENGTH) + 1; @@ -40,7 +36,8 @@ const key_type *cudaBinarySearch(key_type *const start, const key_type *end, if (*last_known_point == val) { return last_known_point; } - son = get_son_from_step(son, (*last_known_point > val)); + // son = get_son_from_step(son, (*last_known_point > val)); + son = son * 2 + -((*last_known_point - val) >> 31); last_known_point = next_level_start + son; printf("%d\n", *last_known_point); } @@ -73,6 +70,6 @@ int main() { assert(calculate_location(i) == result[i]); } puts(""); - cudaBinarySearch(&result[0], &*result.end(), 1024); + cudaBinarySearch(&result[0], &*result.end(), 928); return 0; } diff --git a/expt_0804.cu b/expt_0804.cu index 3a599ef..73d2c82 100644 --- a/expt_0804.cu +++ b/expt_0804.cu @@ -51,7 +51,7 @@ __device__ const key_type *cudaBinarySearch(key_type *start, if (*last_known_point == val) { return last_known_point; } - son = get_son_from_step(son, (*last_known_point > val)); + son = son * 2 + -((*last_known_point - val) >> 63); last_known_point = next_level_start + son; } return last_known_point; @@ -191,10 +191,10 @@ int main(int argc, char const *argv[]) { initCuda<<<1, 1>>>(cudaSample, cudaPopulation); cudaDeviceSynchronize(); - dim3 grid_dim = 2, block_dim = 512; + dim3 grid_dim = 64, block_dim = 16; unsigned long step = test_size / (grid_dim.x * block_dim.x); - printf("step: %lu\n", step); + printf("(new) step: %lu\n", step); assert(!(test_size % (grid_dim.x * block_dim.x))); for (int scale = 2; scale <= 8; scale++) { |
