Skip to content

Conversation

sterrettm2
Copy link
Contributor

After this change, qsort, qselect, and partial_qsort now take an additional argument to select descending order. This change also adds tests for this functionality.

For benchmarking, I compared the ascending direction against the previous version, and then compared the ascending direction against the new descending direction

When we compare the ascending and descending orders against once another using quicksort, we see no significant change (see the full results at the bottom).

Comparing to previous versions, there is no significant effect on the performance of quickselect, and we see a small speed up for 32-bit values using quicksort

Quickselect:

Benchmark                                                            Time             CPU      Time Old      Time New       CPU Old       CPU New
-------------------------------------------------------------------------------------------------------------------------------------------------
[simdqselect/k1000 vs. simdqselect/k1000]/uint64_t                +0.0043         +0.0035          7342          7374          7354          7380
[simdqselect/k1000 vs. simdqselect/k1000]/int64_t                 +0.0066         +0.0059          7322          7370          7336          7379
[simdqselect/k1000 vs. simdqselect/k1000]/uint32_t                -0.0395         -0.0412          4673          4488          4688          4495
[simdqselect/k1000 vs. simdqselect/k1000]/int32_t                 -0.0342         -0.0348          4642          4483          4653          4491
[simdqselect/k1000 vs. simdqselect/k1000]/uint16_t                +0.1300         +0.1300         60960         68885         60964         68891
[simdqselect/k1000 vs. simdqselect/k1000]/int16_t                 +0.0045         +0.0042         63422         63705         63428         63692
[simdqselect/k1000 vs. simdqselect/k1000]/float                   -0.0513         -0.0525          4212          3996          4224          4002
[simdqselect/k1000 vs. simdqselect/k1000]/double                  -0.0101         -0.0113          5960          5900          5973          5905
OVERALL_GEOMEAN                                                   -0.0000         -0.0009             0             0             0             0

Quicksort

Benchmark                                                              Time             CPU      Time Old      Time New       CPU Old       CPU New
---------------------------------------------------------------------------------------------------------------------------------------------------
[simdsort/random_1m vs. simdsort/random_1m]/uint64_t                +0.0043         +0.0044       7931858       7966264       7930906       7965608
[simdsort/random_1m vs. simdsort/random_1m]/int64_t                 -0.0218         -0.0217       8103866       7927270       8101909       7926299
[simdsort/random_1m vs. simdsort/random_1m]/uint32_t                -0.1180         -0.1180       4193022       3698194       4191991       3697354
[simdsort/random_1m vs. simdsort/random_1m]/int32_t                 -0.1167         -0.1167       4166260       3680043       4165618       3679336
[simdsort/random_1m vs. simdsort/random_1m]/uint16_t                -0.0047         -0.0047      61070653      60782910      61064782      60775644
[simdsort/random_1m vs. simdsort/random_1m]/int16_t                 +0.1319         +0.1319      61267523      69347932      61261653      69340388
[simdsort/random_1m vs. simdsort/random_1m]/float                   -0.1634         -0.1634       4254422       3559156       4253451       3558537
[simdsort/random_1m vs. simdsort/random_1m]/double                  -0.0604         -0.0605       7051407       6625320       7050672       6624069
OVERALL_GEOMEAN                                                     -0.0475         -0.0475             0             0             0             0

Ascending/descending comparison:

Benchmark                                                                   Time             CPU      Time Old      Time New       CPU Old       CPU New
--------------------------------------------------------------------------------------------------------------------------------------------------------
[simdsort.*random vs. simd_revsort.*random]_128/uint64_t                 +0.0006         +0.0004          1060          1060          1062          1062
[simdsort.*random vs. simd_revsort.*random]_256/uint64_t                 -0.0072         -0.0078          1377          1367          1379          1369
[simdsort.*random vs. simd_revsort.*random]_512/uint64_t                 -0.0060         -0.0058          2757          2741          2762          2746
[simdsort.*random vs. simd_revsort.*random]_1k/uint64_t                  -0.0810         -0.0809          4364          4011          4368          4015
[simdsort.*random vs. simd_revsort.*random]_5k/uint64_t                  -0.0482         -0.0482         24291         23121         24301         23131
[simdsort.*random vs. simd_revsort.*random]_100k/uint64_t                -0.0238         -0.0235        608572        594090        608380        594075
[simdsort.*random vs. simd_revsort.*random]_1m/uint64_t                  -0.0033         -0.0033       7978730       7952560       7978517       7952442
[simdsort.*random vs. simd_revsort.*random]_10m/uint64_t                 -0.0029         -0.0029     102414876     102115493     102412715     102112589
[simdsort.*random vs. simd_revsort.*random]_100m/uint64_t                -0.0008         -0.0009    1259520113    1258454621    1259497546    1258410113
[simdsort.*random vs. simd_revsort.*random]_128/int64_t                  +0.0091         +0.0115          1062          1072          1062          1075
[simdsort.*random vs. simd_revsort.*random]_256/int64_t                  +0.0003         +0.0000          1369          1370          1372          1372
[simdsort.*random vs. simd_revsort.*random]_512/int64_t                  -0.0116         -0.0102          2766          2734          2769          2740
[simdsort.*random vs. simd_revsort.*random]_1k/int64_t                   -0.0777         -0.0776          4367          4028          4374          4034
[simdsort.*random vs. simd_revsort.*random]_5k/int64_t                   -0.0468         -0.0468         24302         23165         24310         23172
[simdsort.*random vs. simd_revsort.*random]_100k/int64_t                 -0.0241         -0.0241        610224        595520        610105        595391
[simdsort.*random vs. simd_revsort.*random]_1m/int64_t                   +0.0079         +0.0079       7926105       7988515       7925666       7988663
[simdsort.*random vs. simd_revsort.*random]_10m/int64_t                  +0.0028         +0.0029     101918003     102207733     101914104     102205756
[simdsort.*random vs. simd_revsort.*random]_100m/int64_t                 +0.0024         +0.0025    1255207252    1258257754    1255128043    1258215319
[simdsort.*random vs. simd_revsort.*random]_128/uint32_t                 +0.0013         +0.0008           932           933           935           936
[simdsort.*random vs. simd_revsort.*random]_256/uint32_t                 +0.0105         +0.0094          1059          1070          1061          1071
[simdsort.*random vs. simd_revsort.*random]_512/uint32_t                 -0.0110         -0.0098          1389          1374          1392          1378
[simdsort.*random vs. simd_revsort.*random]_1k/uint32_t                  +0.1226         +0.1208          2465          2767          2472          2771
[simdsort.*random vs. simd_revsort.*random]_5k/uint32_t                  -0.0372         -0.0368         12073         11623         12065         11621
[simdsort.*random vs. simd_revsort.*random]_100k/uint32_t                -0.0001         -0.0001        279329        279315        279348        279318
[simdsort.*random vs. simd_revsort.*random]_1m/uint32_t                  +0.0035         +0.0035       3682480       3695191       3682036       3694836
[simdsort.*random vs. simd_revsort.*random]_10m/uint32_t                 -0.0068         -0.0069      47865896      47539560      47865734      47535778
[simdsort.*random vs. simd_revsort.*random]_100m/uint32_t                +0.0017         +0.0018     593389839     594418753     593346547     594416987
[simdsort.*random vs. simd_revsort.*random]_128/int32_t                  -0.0003         -0.0006           933           932           935           935
[simdsort.*random vs. simd_revsort.*random]_256/int32_t                  +0.0099         +0.0105          1060          1070          1060          1071
[simdsort.*random vs. simd_revsort.*random]_512/int32_t                  -0.0041         -0.0032          1385          1379          1387          1382
[simdsort.*random vs. simd_revsort.*random]_1k/int32_t                   +0.1271         +0.1245          2465          2778          2474          2782
[simdsort.*random vs. simd_revsort.*random]_5k/int32_t                   -0.0307         -0.0301         12083         11712         12077         11714
[simdsort.*random vs. simd_revsort.*random]_100k/int32_t                 +0.0073         +0.0073        278556        280585        278566        280609
[simdsort.*random vs. simd_revsort.*random]_1m/int32_t                   +0.0058         +0.0058       3691527       3712865       3691265       3712534
[simdsort.*random vs. simd_revsort.*random]_10m/int32_t                  -0.0027         -0.0026      47704384      47575883      47700286      47575196
[simdsort.*random vs. simd_revsort.*random]_100m/int32_t                 +0.0045         +0.0045     593561444     596249100     593547730     596224591
[simdsort.*random vs. simd_revsort.*random]_128/float                    +0.0021         +0.0009           938           940           941           942
[simdsort.*random vs. simd_revsort.*random]_256/float                    +0.0081         +0.0076          1034          1042          1036          1044
[simdsort.*random vs. simd_revsort.*random]_512/float                    -0.0022         -0.0006          1304          1301          1306          1305
[simdsort.*random vs. simd_revsort.*random]_1k/float                     +0.0858         +0.0865          2323          2522          2327          2528
[simdsort.*random vs. simd_revsort.*random]_5k/float                     -0.1145         -0.1145         11571         10246         11563         10239
[simdsort.*random vs. simd_revsort.*random]_100k/float                   -0.0087         -0.0088        260897        258618        260928        258625
[simdsort.*random vs. simd_revsort.*random]_1m/float                     -0.0132         -0.0133       3553251       3506387       3553124       3505991
[simdsort.*random vs. simd_revsort.*random]_10m/float                    +0.0015         +0.0014      46133404      46203755      46132606      46197298
[simdsort.*random vs. simd_revsort.*random]_100m/float                   +0.0112         +0.0112     568501875     574889202     568492289     574835898
[simdsort.*random vs. simd_revsort.*random]_128/double                   +0.0060         +0.0061           980           986           981           987
[simdsort.*random vs. simd_revsort.*random]_256/double                   -0.0141         -0.0143          1177          1160          1180          1163
[simdsort.*random vs. simd_revsort.*random]_512/double                   -0.0174         -0.0176          2144          2107          2148          2110
[simdsort.*random vs. simd_revsort.*random]_1k/double                    -0.0327         -0.0325          3839          3713          3842          3717
[simdsort.*random vs. simd_revsort.*random]_5k/double                    +0.0362         +0.0363         16935         17548         16942         17557
[simdsort.*random vs. simd_revsort.*random]_100k/double                  -0.0101         -0.0104        476009        471187        476088        471124
[simdsort.*random vs. simd_revsort.*random]_1m/double                    +0.0005         +0.0006       6627016       6630062       6626434       6630119
[simdsort.*random vs. simd_revsort.*random]_10m/double                   +0.0045         +0.0044      89101633      89498385      89097144      89493556
[simdsort.*random vs. simd_revsort.*random]_100m/double                  -0.0035         -0.0035    1121419501    1117520332    1121395069    1117472530
OVERALL_GEOMEAN                                                          -0.0078         -0.0077             0             0             0             0

Copy link
Member

@r-devulap r-devulap left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good so far, yet to review the changes in src files. I simplified the code in scalar function to make it more readable. Let me know if that looks good.

Copy link
Member

@r-devulap r-devulap left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, thanks Matthew!

@r-devulap r-devulap merged commit 0792fbd into numpy:main Mar 28, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants