mirror of
https://github.com/isar/libmdbx.git
synced 2025-01-02 02:14:13 +08:00
mdbx: refine network-sorting.
Change-Id: I086626c3da05b11362612d87eae23371f67ea1b0
This commit is contained in:
parent
308548e226
commit
d159a8252d
@ -1466,7 +1466,8 @@ static int lcklist_detach_locked(MDBX_env *env) {
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* LY: State of the art quicksort-based sorting, with internal stack
|
||||
* and bitonic-sort for small chunks. */
|
||||
* and network-sort for small chunks.
|
||||
* Thanks to John M. Gamble for the http://pages.ripco.net/~jgamble/nw.html */
|
||||
|
||||
#define SORT_CMP_SWAP(TYPE, CMP, a, b) \
|
||||
do { \
|
||||
@ -1476,19 +1477,36 @@ static int lcklist_detach_locked(MDBX_env *env) {
|
||||
(b) = swap_cmp ? b : swap_tmp; \
|
||||
} while (0)
|
||||
|
||||
#define SORT_BITONIC_2(TYPE, CMP, begin) \
|
||||
do { \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[1]); \
|
||||
} while (0)
|
||||
|
||||
#define SORT_BITONIC_3(TYPE, CMP, begin) \
|
||||
// 3 comparators, 3 parallel operations
|
||||
// o-----^--^--o
|
||||
// | |
|
||||
// o--^--|--v--o
|
||||
// | |
|
||||
// o--v--v-----o
|
||||
//
|
||||
// [[1,2]]
|
||||
// [[0,2]]
|
||||
// [[0,1]]
|
||||
#define SORT_NETWORK_3(TYPE, CMP, begin) \
|
||||
do { \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[2]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[2]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[1]); \
|
||||
} while (0)
|
||||
|
||||
#define SORT_BITONIC_4(TYPE, CMP, begin) \
|
||||
// 5 comparators, 3 parallel operations
|
||||
// o--^--^--------o
|
||||
// | |
|
||||
// o--v--|--^--^--o
|
||||
// | | |
|
||||
// o--^--v--|--v--o
|
||||
// | |
|
||||
// o--v-----v-----o
|
||||
//
|
||||
// [[0,1],[2,3]]
|
||||
// [[0,2],[1,3]]
|
||||
// [[1,2]]
|
||||
#define SORT_NETWORK_4(TYPE, CMP, begin) \
|
||||
do { \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[1]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[3]); \
|
||||
@ -1497,20 +1515,55 @@ static int lcklist_detach_locked(MDBX_env *env) {
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[2]); \
|
||||
} while (0)
|
||||
|
||||
#define SORT_BITONIC_5(TYPE, CMP, begin) \
|
||||
// 9 comparators, 5 parallel operations
|
||||
// o--^--^-----^-----------o
|
||||
// | | |
|
||||
// o--|--|--^--v-----^--^--o
|
||||
// | | | | |
|
||||
// o--|--v--|--^--^--|--v--o
|
||||
// | | | | |
|
||||
// o--|-----v--|--v--|--^--o
|
||||
// | | | |
|
||||
// o--v--------v-----v--v--o
|
||||
//
|
||||
// [[0,4],[1,3]]
|
||||
// [[0,2]]
|
||||
// [[2,4],[0,1]]
|
||||
// [[2,3],[1,4]]
|
||||
// [[1,2],[3,4]]
|
||||
#define SORT_NETWORK_5(TYPE, CMP, begin) \
|
||||
do { \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[1]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[3], begin[4]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[4]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[3]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[2]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[4]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[1]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[3]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[4]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[3]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[2]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[3]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[2]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[3], begin[4]); \
|
||||
} while (0)
|
||||
|
||||
#define SORT_BITONIC_6(TYPE, CMP, begin) \
|
||||
// 12 comparators, 6 parallel operations
|
||||
// o-----^--^--^-----------------o
|
||||
// | | |
|
||||
// o--^--|--v--|--^--------^-----o
|
||||
// | | | | |
|
||||
// o--v--v-----|--|--^--^--|--^--o
|
||||
// | | | | | |
|
||||
// o-----^--^--v--|--|--|--v--v--o
|
||||
// | | | | |
|
||||
// o--^--|--v-----v--|--v--------o
|
||||
// | | |
|
||||
// o--v--v-----------v-----------o
|
||||
//
|
||||
// [[1,2],[4,5]]
|
||||
// [[0,2],[3,5]]
|
||||
// [[0,1],[3,4],[2,5]]
|
||||
// [[0,3],[1,4]]
|
||||
// [[2,4],[1,3]]
|
||||
// [[2,3]]
|
||||
#define SORT_NETWORK_6(TYPE, CMP, begin) \
|
||||
do { \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[2]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[4], begin[5]); \
|
||||
@ -1526,50 +1579,122 @@ static int lcklist_detach_locked(MDBX_env *env) {
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[3]); \
|
||||
} while (0)
|
||||
|
||||
#define SORT_BITONIC_7(TYPE, CMP, begin) \
|
||||
// 16 comparators, 6 parallel operations
|
||||
// o--^--------^-----^-----------------o
|
||||
// | | |
|
||||
// o--|--^-----|--^--v--------^--^-----o
|
||||
// | | | | | |
|
||||
// o--|--|--^--v--|--^-----^--|--v-----o
|
||||
// | | | | | | |
|
||||
// o--|--|--|-----v--|--^--v--|--^--^--o
|
||||
// | | | | | | | |
|
||||
// o--v--|--|--^-----v--|--^--v--|--v--o
|
||||
// | | | | | |
|
||||
// o-----v--|--|--------v--v-----|--^--o
|
||||
// | | | |
|
||||
// o--------v--v-----------------v--v--o
|
||||
//
|
||||
// [[0,4],[1,5],[2,6]]
|
||||
// [[0,2],[1,3],[4,6]]
|
||||
// [[2,4],[3,5],[0,1]]
|
||||
// [[2,3],[4,5]]
|
||||
// [[1,4],[3,6]]
|
||||
// [[1,2],[3,4],[5,6]]
|
||||
#define SORT_NETWORK_7(TYPE, CMP, begin) \
|
||||
do { \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[4]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[5]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[6]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[2]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[3]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[4], begin[6]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[4]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[3], begin[5]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[1]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[3]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[4], begin[5]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[4]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[3], begin[6]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[2]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[3], begin[4]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[5], begin[6]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[2]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[3], begin[5]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[4], begin[6]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[1]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[4], begin[5]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[6]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[4]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[5]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[3]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[5]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[3]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[4]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[3]); \
|
||||
} while (0)
|
||||
|
||||
#define SORT_BITONIC_8(TYPE, CMP, begin) \
|
||||
// 19 comparators, 6 parallel operations
|
||||
// o--^--------^-----^-----------------o
|
||||
// | | |
|
||||
// o--|--^-----|--^--v--------^--^-----o
|
||||
// | | | | | |
|
||||
// o--|--|--^--v--|--^-----^--|--v-----o
|
||||
// | | | | | | |
|
||||
// o--|--|--|--^--v--|--^--v--|--^--^--o
|
||||
// | | | | | | | | |
|
||||
// o--v--|--|--|--^--v--|--^--v--|--v--o
|
||||
// | | | | | | |
|
||||
// o-----v--|--|--|--^--v--v-----|--^--o
|
||||
// | | | | | |
|
||||
// o--------v--|--v--|--^--------v--v--o
|
||||
// | | |
|
||||
// o-----------v-----v--v--------------o
|
||||
//
|
||||
// [[0,4],[1,5],[2,6],[3,7]]
|
||||
// [[0,2],[1,3],[4,6],[5,7]]
|
||||
// [[2,4],[3,5],[0,1],[6,7]]
|
||||
// [[2,3],[4,5]]
|
||||
// [[1,4],[3,6]]
|
||||
// [[1,2],[3,4],[5,6]]
|
||||
#define SORT_NETWORK_8(TYPE, CMP, begin) \
|
||||
do { \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[1]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[3]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[4], begin[5]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[6], begin[7]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[4]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[5]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[6]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[3], begin[7]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[2]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[3]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[4], begin[6]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[5], begin[7]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[2]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[5], begin[6]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[4]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[3], begin[7]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[5]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[6]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[4]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[3], begin[6]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[4]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[3], begin[5]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[1]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[6], begin[7]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[3]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[4], begin[5]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[4]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[3], begin[6]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[2]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[3], begin[4]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[5], begin[6]); \
|
||||
} while (0)
|
||||
|
||||
#define SORT_BITONIC_9(TYPE, CMP, begin) \
|
||||
// 25 comparators, 9 parallel operations
|
||||
// o--^-----^--^-----^-----------------------------------o
|
||||
// | | | |
|
||||
// o--v--^--v--|-----|--^-----^-----------^--------------o
|
||||
// | | | | | |
|
||||
// o-----v-----|-----|--|-----|--^-----^--|--^-----^--^--o
|
||||
// | | | | | | | | | |
|
||||
// o--^-----^--v--^--v--|-----|--|-----|--v--|-----|--v--o
|
||||
// | | | | | | | | |
|
||||
// o--v--^--v-----|-----v--^--v--|-----|-----|--^--v-----o
|
||||
// | | | | | | |
|
||||
// o-----v--------|--------|-----v--^--v--^--|--|--^-----o
|
||||
// | | | | | | |
|
||||
// o--^-----^-----v--------|--------|-----|--v--v--v-----o
|
||||
// | | | | |
|
||||
// o--v--^--v--------------v--------|-----v--------------o
|
||||
// | |
|
||||
// o-----v--------------------------v--------------------o
|
||||
//
|
||||
// [[0,1],[3,4],[6,7]]
|
||||
// [[1,2],[4,5],[7,8]]
|
||||
// [[0,1],[3,4],[6,7],[2,5]]
|
||||
// [[0,3],[1,4],[5,8]]
|
||||
// [[3,6],[4,7],[2,5]]
|
||||
// [[0,3],[1,4],[5,7],[2,6]]
|
||||
// [[1,3],[4,6]]
|
||||
// [[2,4],[5,6]]
|
||||
// [[2,3]]
|
||||
#define SORT_NETWORK_9(TYPE, CMP, begin) \
|
||||
do { \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[1]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[3], begin[4]); \
|
||||
@ -1598,7 +1723,37 @@ static int lcklist_detach_locked(MDBX_env *env) {
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[3]); \
|
||||
} while (0)
|
||||
|
||||
#define SORT_BITONIC_10(TYPE, CMP, begin) \
|
||||
// 29 comparators, 9 parallel operations
|
||||
// o--------------^-----^--^--^-----------------------o
|
||||
// | | | |
|
||||
// o-----------^--|--^--|--|--v--^--------^-----------o
|
||||
// | | | | | | |
|
||||
// o--------^--|--|--|--|--v--^--v-----^--|--^--------o
|
||||
// | | | | | | | | |
|
||||
// o-----^--|--|--|--|--v--^--|-----^--|--v--v--^-----o
|
||||
// | | | | | | | | | |
|
||||
// o--^--|--|--|--|--v-----|--v--^--|--|--^-----v--^--o
|
||||
// | | | | | | | | | | |
|
||||
// o--|--|--|--|--v--^-----|--^--|--v--v--|-----^--v--o
|
||||
// | | | | | | | | | |
|
||||
// o--|--|--|--v--^--|-----v--|--v--^-----|--^--v-----o
|
||||
// | | | | | | | | |
|
||||
// o--|--|--v-----|--|--^-----v--^--|-----v--v--------o
|
||||
// | | | | | | |
|
||||
// o--|--v--------|--v--|--^-----v--v-----------------o
|
||||
// | | | |
|
||||
// o--v-----------v-----v--v--------------------------o
|
||||
//
|
||||
// [[4,9],[3,8],[2,7],[1,6],[0,5]]
|
||||
// [[1,4],[6,9],[0,3],[5,8]]
|
||||
// [[0,2],[3,6],[7,9]]
|
||||
// [[0,1],[2,4],[5,7],[8,9]]
|
||||
// [[1,2],[4,6],[7,8],[3,5]]
|
||||
// [[2,5],[6,8],[1,3],[4,7]]
|
||||
// [[2,3],[6,7]]
|
||||
// [[3,4],[5,6]]
|
||||
// [[4,5]]
|
||||
#define SORT_NETWORK_10(TYPE, CMP, begin) \
|
||||
do { \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[4], begin[9]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[3], begin[8]); \
|
||||
@ -1631,7 +1786,39 @@ static int lcklist_detach_locked(MDBX_env *env) {
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[4], begin[5]); \
|
||||
} while (0)
|
||||
|
||||
#define SORT_BITONIC_11(TYPE, CMP, begin) \
|
||||
// 35 comparators, 9 parallel operations
|
||||
// o--^-----^-----------------^--------^--------------------o
|
||||
// | | | |
|
||||
// o--v--^--|--^--^--------^--|--------|--^-----------------o
|
||||
// | | | | | | | |
|
||||
// o--^--|--v--v--|-----^--|--|--------|--|-----^--^--------o
|
||||
// | | | | | | | | | |
|
||||
// o--v--v--------|-----|--|--|--^-----|--|--^--v--|--^--^--o
|
||||
// | | | | | | | | | | |
|
||||
// o--^-----^-----|-----|--|--v--|--^--v--v--|-----v--|--v--o
|
||||
// | | | | | | | | |
|
||||
// o--v--^--|--^--v--^--|--v-----|--|--------|--------v--^--o
|
||||
// | | | | | | | | |
|
||||
// o--^--|--v--v--^--|--v--^-----|--|--------|--------^--v--o
|
||||
// | | | | | | | | |
|
||||
// o--v--v--------|--|-----|-----v--|--^-----|-----^--|--^--o
|
||||
// | | | | | | | | |
|
||||
// o--^--^--------|--|-----|--------v--|-----v--^--|--v--v--o
|
||||
// | | | | | | | |
|
||||
// o--v--|--^-----|--v-----|-----------|--------v--v--------o
|
||||
// | | | | |
|
||||
// o-----v--v-----v--------v-----------v--------------------o
|
||||
//
|
||||
// [[0,1],[2,3],[4,5],[6,7],[8,9]]
|
||||
// [[1,3],[5,7],[0,2],[4,6],[8,10]]
|
||||
// [[1,2],[5,6],[9,10],[0,4],[3,7]]
|
||||
// [[1,5],[6,10],[4,8]]
|
||||
// [[5,9],[2,6],[0,4],[3,8]]
|
||||
// [[1,5],[6,10],[2,3],[8,9]]
|
||||
// [[1,4],[7,10],[3,5],[6,8]]
|
||||
// [[2,4],[7,9],[5,6]]
|
||||
// [[3,4],[7,8]]
|
||||
#define SORT_NETWORK_11(TYPE, CMP, begin) \
|
||||
do { \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[1]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[3]); \
|
||||
@ -1670,7 +1857,41 @@ static int lcklist_detach_locked(MDBX_env *env) {
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[7], begin[8]); \
|
||||
} while (0)
|
||||
|
||||
#define SORT_BITONIC_12(TYPE, CMP, begin) \
|
||||
// 39 comparators, parallel operations
|
||||
// o--^-----^-----------------^--------^--------------------o
|
||||
// | | | |
|
||||
// o--v--^--|--^--^--------^--|--------|--^-----------------o
|
||||
// | | | | | | | |
|
||||
// o--^--|--v--v--|-----^--|--|--------|--|-----^--^--------o
|
||||
// | | | | | | | | | |
|
||||
// o--v--v--------|-----|--|--|--^-----|--|--^--v--|--^--^--o
|
||||
// | | | | | | | | | | |
|
||||
// o--^-----^-----|-----|--|--v--|--^--v--v--|-----v--|--v--o
|
||||
// | | | | | | | | |
|
||||
// o--v--^--|--^--v--^--|--v-----|--|--------|--------v--^--o
|
||||
// | | | | | | | | |
|
||||
// o--^--|--v--v--^--|--v--^-----|--|--------|--------^--v--o
|
||||
// | | | | | | | | |
|
||||
// o--v--v--------|--|-----|--^--v--|--^--^--|-----^--|--^--o
|
||||
// | | | | | | | | | | |
|
||||
// o--^-----^-----|--|-----|--|-----v--|--|--v--^--|--v--v--o
|
||||
// | | | | | | | | | |
|
||||
// o--v--^--|--^--|--v-----|--|--------|--|-----v--v--------o
|
||||
// | | | | | | | |
|
||||
// o--^--|--v--v--v--------v--|--------|--v-----------------o
|
||||
// | | | |
|
||||
// o--v--v--------------------v--------v--------------------o
|
||||
//
|
||||
// [[0,1],[2,3],[4,5],[6,7],[8,9],[10,11]]
|
||||
// [[1,3],[5,7],[9,11],[0,2],[4,6],[8,10]]
|
||||
// [[1,2],[5,6],[9,10],[0,4],[7,11]]
|
||||
// [[1,5],[6,10],[3,7],[4,8]]
|
||||
// [[5,9],[2,6],[0,4],[7,11],[3,8]]
|
||||
// [[1,5],[6,10],[2,3],[8,9]]
|
||||
// [[1,4],[7,10],[3,5],[6,8]]
|
||||
// [[2,4],[7,9],[5,6]]
|
||||
// [[3,4],[7,8]]
|
||||
#define SORT_NETWORK_12(TYPE, CMP, begin) \
|
||||
do { \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[1]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[3]); \
|
||||
@ -1713,7 +1934,44 @@ static int lcklist_detach_locked(MDBX_env *env) {
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[7], begin[8]); \
|
||||
} while (0)
|
||||
|
||||
#define SORT_BITONIC_13(TYPE, CMP, begin) \
|
||||
// 45 comparators, 10 parallel operations
|
||||
// o--------^--^-----^-----------------------------^-----------------o
|
||||
// | | | |
|
||||
// o--^-----|--v-----|-----^--------------^-----^--|-----^-----------o
|
||||
// | | | | | | | |
|
||||
// o--|-----|--^--^--v-----|--------------|--^--|--|--^--v--^--------o
|
||||
// | | | | | | | | | | |
|
||||
// o--|--^--|--|--v-----^--|--------^-----|--|--v--|--|--^--v-----^--o
|
||||
// | | | | | | | | | | | | |
|
||||
// o--|--v--|--|--^-----|--v-----^--v-----|--|--^--|--|--|--^--^--v--o
|
||||
// | | | | | | | | | | | | | |
|
||||
// o--|--^--|--|--|--^--|--------|-----^--|--|--|--v--v--v--|--v--^--o
|
||||
// | | | | | | | | | | | | | |
|
||||
// o--|--|--|--v--v--|--|--^-----|--^--v--|--v--|--^--------v--^--v--o
|
||||
// | | | | | | | | | | | |
|
||||
// o--v--|--|-----^--|--v--|--^--|--|-----v-----v--|--^--------v-----o
|
||||
// | | | | | | | | | |
|
||||
// o-----v--|--^--|--|-----|--v--|--|--^-----^-----v--v--^-----------o
|
||||
// | | | | | | | | | |
|
||||
// o--^-----|--|--|--v-----|-----v--|--v--^--|--^--------v-----------o
|
||||
// | | | | | | | | |
|
||||
// o--|-----|--|--|--^-----|--------v--^--|--v--v--------------------o
|
||||
// | | | | | | | |
|
||||
// o--v-----|--v--|--v-----|--^--------v--v--------------------------o
|
||||
// | | | |
|
||||
// o--------v-----v--------v--v--------------------------------------o
|
||||
//
|
||||
// [[1,7],[9,11],[3,4],[5,8],[0,12],[2,6]]
|
||||
// [[0,1],[2,3],[4,6],[8,11],[7,12],[5,9]]
|
||||
// [[0,2],[3,7],[10,11],[1,4],[6,12]]
|
||||
// [[7,8],[11,12],[4,9],[6,10]]
|
||||
// [[3,4],[5,6],[8,9],[10,11],[1,7]]
|
||||
// [[2,6],[9,11],[1,3],[4,7],[8,10],[0,5]]
|
||||
// [[2,5],[6,8],[9,10]]
|
||||
// [[1,2],[3,5],[7,8],[4,6]]
|
||||
// [[2,3],[4,5],[6,7],[8,9]]
|
||||
// [[3,4],[5,6]]
|
||||
#define SORT_NETWORK_13(TYPE, CMP, begin) \
|
||||
do { \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[7]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[9], begin[11]); \
|
||||
@ -1762,7 +2020,53 @@ static int lcklist_detach_locked(MDBX_env *env) {
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[5], begin[6]); \
|
||||
} while (0)
|
||||
|
||||
#define SORT_BITONIC_14(TYPE, CMP, begin) \
|
||||
/* *INDENT-OFF* */
|
||||
/* clang-format off */
|
||||
|
||||
// 51 comparators, 10 parallel operations
|
||||
// o--^--^-----^-----------^-----------------------------------------------------------o
|
||||
// | | | |
|
||||
// o--v--|--^--|--^--------|--^-----^-----------------------^--------------------------o
|
||||
// | | | | | | | |
|
||||
// o--^--v--|--|--|--^-----|--|--^--v-----------------------|--^--^--------------------o
|
||||
// | | | | | | | | | | |
|
||||
// o--v-----v--|--|--|--^--|--|--|--^--------------^--------|--|--|--^--^--^-----------o
|
||||
// | | | | | | | | | | | | | | |
|
||||
// o--^--^-----v--|--|--|--|--|--|--|--^-----------|-----^--v--|--v--|--|--v-----------o
|
||||
// | | | | | | | | | | | | | | |
|
||||
// o--v--|--^-----v--|--|--|--|--|--|--|--^--^-----|-----|-----|--^--|--v-----^--------o
|
||||
// | | | | | | | | | | | | | | | | |
|
||||
// o--^--v--|--------v--|--|--|--|--|--|--|--|--^--|-----|-----|--v--|-----^--v-----^--o
|
||||
// | | | | | | | | | | | | | | | | |
|
||||
// o--v-----v-----------v--|--|--|--|--|--|--|--|--|--^--|--^--|-----|--^--|--^--^--v--o
|
||||
// | | | | | | | | | | | | | | | | | |
|
||||
// o--^--^-----^-----------v--|--|--|--|--|--|--|--|--|--v--|--v-----v--|--v--|--v--^--o
|
||||
// | | | | | | | | | | | | | | | |
|
||||
// o--v--|--^--|--^-----------v--|--|--|--|--|--v--|--|-----|--^--------|-----v--^--v--o
|
||||
// | | | | | | | | | | | | | | |
|
||||
// o--^--v--|--|--|--------------v--|--|--|--v-----|--|-----|--v--------|--^-----v-----o
|
||||
// | | | | | | | | | | | |
|
||||
// o--v-----v--|--|-----------------v--|--|--------|--v-----|--^--------|--|--^--------o
|
||||
// | | | | | | | | | |
|
||||
// o--^--------v--|--------------------v--|--------v--------|--|--------v--v--v--------o
|
||||
// | | | | |
|
||||
// o--v-----------v-----------------------v-----------------v--v-----------------------o
|
||||
//
|
||||
// [[0,1],[2,3],[4,5],[6,7],[8,9],[10,11],[12,13]]
|
||||
// [[0,2],[4,6],[8,10],[1,3],[5,7],[9,11]]
|
||||
// [[0,4],[8,12],[1,5],[9,13],[2,6],[3,7]]
|
||||
// [[0,8],[1,9],[2,10],[3,11],[4,12],[5,13]]
|
||||
// [[5,10],[6,9],[3,12],[7,11],[1,2],[4,8]]
|
||||
// [[1,4],[7,13],[2,8],[5,6],[9,10]]
|
||||
// [[2,4],[11,13],[3,8],[7,12]]
|
||||
// [[6,8],[10,12],[3,5],[7,9]]
|
||||
// [[3,4],[5,6],[7,8],[9,10],[11,12]]
|
||||
// [[6,7],[8,9]]
|
||||
|
||||
/* *INDENT-ON* */
|
||||
/* clang-format on */
|
||||
|
||||
#define SORT_NETWORK_14(TYPE, CMP, begin) \
|
||||
do { \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[1]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[3]); \
|
||||
@ -1817,7 +2121,55 @@ static int lcklist_detach_locked(MDBX_env *env) {
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[8], begin[9]); \
|
||||
} while (0)
|
||||
|
||||
#define SORT_BITONIC_15(TYPE, CMP, begin) \
|
||||
/* *INDENT-OFF* */
|
||||
/* clang-format off */
|
||||
|
||||
// 56 comparators, 10 parallel operations
|
||||
// o--^--^-----^-----------^--------------------------------------------------------------o
|
||||
// | | | |
|
||||
// o--v--|--^--|--^--------|--^-----^--------------------------^--------------------------o
|
||||
// | | | | | | | |
|
||||
// o--^--v--|--|--|--^-----|--|--^--v--------------------------|--^--^--------------------o
|
||||
// | | | | | | | | | | |
|
||||
// o--v-----v--|--|--|--^--|--|--|--^-----------------^--------|--|--|--^--^--^-----------o
|
||||
// | | | | | | | | | | | | | | |
|
||||
// o--^--^-----v--|--|--|--|--|--|--|--^--------------|-----^--v--|--v--|--|--v-----------o
|
||||
// | | | | | | | | | | | | | | |
|
||||
// o--v--|--^-----v--|--|--|--|--|--|--|--^-----^-----|-----|-----|--^--|--v-----^--------o
|
||||
// | | | | | | | | | | | | | | | | |
|
||||
// o--^--v--|--------v--|--|--|--|--|--|--|--^--|--^--|-----|-----|--v--|-----^--v-----^--o
|
||||
// | | | | | | | | | | | | | | | | | |
|
||||
// o--v-----v-----------v--|--|--|--|--|--|--|--|--|--|--^--|--^--|-----|--^--|--^--^--v--o
|
||||
// | | | | | | | | | | | | | | | | | | |
|
||||
// o--^--^-----^-----------v--|--|--|--|--|--|--|--|--|--|--v--|--v-----v--|--v--|--v--^--o
|
||||
// | | | | | | | | | | | | | | | | |
|
||||
// o--v--|--^--|--^-----------v--|--|--|--|--|--|--v--|--|-----|--^--------|-----v--^--v--o
|
||||
// | | | | | | | | | | | | | | | |
|
||||
// o--^--v--|--|--|--^-----------v--|--|--|--|--v-----|--|-----|--v--------|--^-----v-----o
|
||||
// | | | | | | | | | | | | | |
|
||||
// o--v-----v--|--|--|--------------v--|--|--|--------|--v-----|--^--^-----|--|--^--------o
|
||||
// | | | | | | | | | | | | |
|
||||
// o--^--^-----v--|--|-----------------v--|--|--------v--------|--|--|-----v--v--v--------o
|
||||
// | | | | | | | | |
|
||||
// o--v--|--------v--|--------------------v--|--^--------------v--|--v--------------------o
|
||||
// | | | | |
|
||||
// o-----v-----------v-----------------------v--v-----------------v-----------------------o
|
||||
//
|
||||
// [[0,1],[2,3],[4,5],[6,7],[8,9],[10,11],[12,13]]
|
||||
// [[0,2],[4,6],[8,10],[12,14],[1,3],[5,7],[9,11]]
|
||||
// [[0,4],[8,12],[1,5],[9,13],[2,6],[10,14],[3,7]]
|
||||
// [[0,8],[1,9],[2,10],[3,11],[4,12],[5,13],[6,14]]
|
||||
// [[5,10],[6,9],[3,12],[13,14],[7,11],[1,2],[4,8]]
|
||||
// [[1,4],[7,13],[2,8],[11,14],[5,6],[9,10]]
|
||||
// [[2,4],[11,13],[3,8],[7,12]]
|
||||
// [[6,8],[10,12],[3,5],[7,9]]
|
||||
// [[3,4],[5,6],[7,8],[9,10],[11,12]]
|
||||
// [[6,7],[8,9]]
|
||||
|
||||
/* *INDENT-ON* */
|
||||
/* clang-format on */
|
||||
|
||||
#define SORT_NETWORK_15(TYPE, CMP, begin) \
|
||||
do { \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[1]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[3]); \
|
||||
@ -1877,7 +2229,57 @@ static int lcklist_detach_locked(MDBX_env *env) {
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[8], begin[9]); \
|
||||
} while (0)
|
||||
|
||||
#define SORT_BITONIC_16(TYPE, CMP, begin) \
|
||||
/* *INDENT-OFF* */
|
||||
/* clang-format off */
|
||||
|
||||
// 60 comparators, 10 parallel operations
|
||||
// o--^--^-----^-----------^-----------------------------------------------------------------o
|
||||
// | | | |
|
||||
// o--v--|--^--|--^--------|--^-----^-----------------------------^--------------------------o
|
||||
// | | | | | | | |
|
||||
// o--^--v--|--|--|--^-----|--|--^--v-----------------------------|--^--^--------------------o
|
||||
// | | | | | | | | | | |
|
||||
// o--v-----v--|--|--|--^--|--|--|--^--------------------^--------|--|--|--^--^--^-----------o
|
||||
// | | | | | | | | | | | | | | |
|
||||
// o--^--^-----v--|--|--|--|--|--|--|--^-----------------|-----^--v--|--v--|--|--v-----------o
|
||||
// | | | | | | | | | | | | | | |
|
||||
// o--v--|--^-----v--|--|--|--|--|--|--|--^--------^-----|-----|-----|--^--|--v-----^--------o
|
||||
// | | | | | | | | | | | | | | | | |
|
||||
// o--^--v--|--------v--|--|--|--|--|--|--|--^-----|--^--|-----|-----|--v--|-----^--v-----^--o
|
||||
// | | | | | | | | | | | | | | | | | |
|
||||
// o--v-----v-----------v--|--|--|--|--|--|--|--^--|--|--|--^--|--^--|-----|--^--|--^--^--v--o
|
||||
// | | | | | | | | | | | | | | | | | | | |
|
||||
// o--^--^-----^-----------v--|--|--|--|--|--|--|--|--|--|--|--v--|--v-----v--|--v--|--v--^--o
|
||||
// | | | | | | | | | | | | | | | | | |
|
||||
// o--v--|--^--|--^-----------v--|--|--|--|--|--|--|--v--|--|-----|--^--------|-----v--^--v--o
|
||||
// | | | | | | | | | | | | | | | | |
|
||||
// o--^--v--|--|--|--^-----------v--|--|--|--|--|--v-----|--|-----|--v--------|--^-----v-----o
|
||||
// | | | | | | | | | | | | | | |
|
||||
// o--v-----v--|--|--|--^-----------v--|--|--|--|--------|--v-----|--^--^-----|--|--^--------o
|
||||
// | | | | | | | | | | | | | | |
|
||||
// o--^--^-----v--|--|--|--------------v--|--|--|--------v--------|--|--|-----v--v--v--------o
|
||||
// | | | | | | | | | | |
|
||||
// o--v--|--^-----v--|--|-----------------v--|--|--^--------------v--|--v--------------------o
|
||||
// | | | | | | | |
|
||||
// o--^--v--|--------v--|--------------------v--|--v-----------------v-----------------------o
|
||||
// | | | |
|
||||
// o--v-----v-----------v-----------------------v--------------------------------------------o
|
||||
//
|
||||
// [[0,1],[2,3],[4,5],[6,7],[8,9],[10,11],[12,13],[14,15]]
|
||||
// [[0,2],[4,6],[8,10],[12,14],[1,3],[5,7],[9,11],[13,15]]
|
||||
// [[0,4],[8,12],[1,5],[9,13],[2,6],[10,14],[3,7],[11,15]]
|
||||
// [[0,8],[1,9],[2,10],[3,11],[4,12],[5,13],[6,14],[7,15]]
|
||||
// [[5,10],[6,9],[3,12],[13,14],[7,11],[1,2],[4,8]]
|
||||
// [[1,4],[7,13],[2,8],[11,14],[5,6],[9,10]]
|
||||
// [[2,4],[11,13],[3,8],[7,12]]
|
||||
// [[6,8],[10,12],[3,5],[7,9]]
|
||||
// [[3,4],[5,6],[7,8],[9,10],[11,12]]
|
||||
// [[6,7],[8,9]]
|
||||
|
||||
/* *INDENT-ON* */
|
||||
/* clang-format on */
|
||||
|
||||
#define SORT_NETWORK_16(TYPE, CMP, begin) \
|
||||
do { \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[1]); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[3]); \
|
||||
@ -1949,49 +2351,49 @@ static int lcklist_detach_locked(MDBX_env *env) {
|
||||
case 1: \
|
||||
break; \
|
||||
case 2: \
|
||||
SORT_BITONIC_2(TYPE, CMP, begin); \
|
||||
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[1]); \
|
||||
break; \
|
||||
case 3: \
|
||||
SORT_BITONIC_3(TYPE, CMP, begin); \
|
||||
SORT_NETWORK_3(TYPE, CMP, begin); \
|
||||
break; \
|
||||
case 4: \
|
||||
SORT_BITONIC_4(TYPE, CMP, begin); \
|
||||
SORT_NETWORK_4(TYPE, CMP, begin); \
|
||||
break; \
|
||||
case 5: \
|
||||
SORT_BITONIC_5(TYPE, CMP, begin); \
|
||||
SORT_NETWORK_5(TYPE, CMP, begin); \
|
||||
break; \
|
||||
case 6: \
|
||||
SORT_BITONIC_6(TYPE, CMP, begin); \
|
||||
SORT_NETWORK_6(TYPE, CMP, begin); \
|
||||
break; \
|
||||
case 7: \
|
||||
SORT_BITONIC_7(TYPE, CMP, begin); \
|
||||
SORT_NETWORK_7(TYPE, CMP, begin); \
|
||||
break; \
|
||||
case 8: \
|
||||
SORT_BITONIC_8(TYPE, CMP, begin); \
|
||||
SORT_NETWORK_8(TYPE, CMP, begin); \
|
||||
break; \
|
||||
case 9: \
|
||||
SORT_BITONIC_9(TYPE, CMP, begin); \
|
||||
SORT_NETWORK_9(TYPE, CMP, begin); \
|
||||
break; \
|
||||
case 10: \
|
||||
SORT_BITONIC_10(TYPE, CMP, begin); \
|
||||
SORT_NETWORK_10(TYPE, CMP, begin); \
|
||||
break; \
|
||||
case 11: \
|
||||
SORT_BITONIC_11(TYPE, CMP, begin); \
|
||||
SORT_NETWORK_11(TYPE, CMP, begin); \
|
||||
break; \
|
||||
case 12: \
|
||||
SORT_BITONIC_12(TYPE, CMP, begin); \
|
||||
SORT_NETWORK_12(TYPE, CMP, begin); \
|
||||
break; \
|
||||
case 13: \
|
||||
SORT_BITONIC_13(TYPE, CMP, begin); \
|
||||
SORT_NETWORK_13(TYPE, CMP, begin); \
|
||||
break; \
|
||||
case 14: \
|
||||
SORT_BITONIC_14(TYPE, CMP, begin); \
|
||||
SORT_NETWORK_14(TYPE, CMP, begin); \
|
||||
break; \
|
||||
case 15: \
|
||||
SORT_BITONIC_15(TYPE, CMP, begin); \
|
||||
SORT_NETWORK_15(TYPE, CMP, begin); \
|
||||
break; \
|
||||
case 16: \
|
||||
SORT_BITONIC_16(TYPE, CMP, begin); \
|
||||
SORT_NETWORK_16(TYPE, CMP, begin); \
|
||||
break; \
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user