Skip to content

Commit a282dfc

Browse files
committed
Add heterogeneous lookup example
1 parent 997ff31 commit a282dfc

File tree

3 files changed

+136
-4
lines changed

3 files changed

+136
-4
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,7 @@ We plan to add many GPU-accelerated, concurrent data structures to `cuCollection
206206
`cuco::static_set` is a fixed-size container that stores unique elements in no particular order. See the Doxygen documentation in `static_set.cuh` for more detailed information.
207207

208208
#### Examples:
209+
- [Heterogeneous Lookup](https://github.com/NVIDIA/cuCollections/blob/dev/examples/static_set/heterogeneous_lookup_example.cu) (see [live example in godbolt](https://godbolt.org/clientstate/eJydVw1v4zYS_StzOvRgJ7KdZLto4XygvuwWZ3SRFEm2RbEOFFoaW8RKpJai7PgM__ebISXZTtbda23AFsnhzJs3M-RoHZRYllKrMhh-WgcyCYanYZAJNa_EHINhEFeJCMKg1JWJeTw4mig4gmtdrIycpxY6cRfOTs7ehnDz2_jdeATXt3e_3t6NHsa3N32WdfIfZIyqxAQqlaABmyKMChHTX70Swm9oGAic9U-gwwKToF6bBN1zp2WlK8jFCpS2UJVIamQJM5kh4HOMhQWpINZ5kUmhYoSltKkzVetxcOCPWomeWkHygnYUNJrtSoKwLXT-pNYWw8FguVz2hYPd12Y-yLxwOfgwvn5_c_--R9DbbR9VRsyCwS-VNOT4dAWiIGSxmBLeTCxBGxBzg7RmNSNfGmmlmodQ6pldCoNOTyJLa-S0snvkNTjJ_10Bok8oIm50D-P7SQD_Ht2P70On5_fxw39uPz7A76O7u9HNw_j9PdzeUbBu3o05VDT6GUY3f8Av45t3ISBRR6bwuTDsBUGVTCsmnsN7xD0YM-1hlQXGciZjaDII5nqBRpFbUKDJpc81Apk4PZnMpRXWzb1yzpkaTNRE_VOqOKsShIu4ivWg5C1xVKLtx1V69VIiESSRDJgVNY8WEpdXuwI2NVVpBwkuyEy0wNhq03-pRWrajiJ304MjH9KfXKqlaNHoOSrUVRllWn-uigifBfGDhKdNgJ-mRuIM3mFO3lkjLJaQ6iUHm3M3FWUK5AIIogO8GrAuOepc1FRgUokMEmGFT2bvE3zGVbm1Q9WA8MClUKPgrOCIJK1prquiMoWmbKUkyVZ9GFsW40qSyiJx79KwdAjJeE4EOPUUNtKVC2VhSVVDMol2Eo0xkc0JqU3zbbxawjwFH0s0vQRnUpERwg5UE-QWqeJipUQHu9StU6SBMFexhXwVeck1zbejDkd4OKQQ808b4yNHUxeGEPHDmn82sN7wVo8HtoiuU4w_lyBnrWVgGDJBRZlFFqei9OVEnkpKfpVQspRcpTRR69qPjzBGrPzKgP-iqM6wiLwkj7iUYKp1BpooFZR0nW6HqH9zFlnI0jKEZmDSsuv3sB7nO9A5Yiuj3InXu9rR4Jz9RPsfQ7eRD0rYcBD-TwhfZ5MRRTT-BipRURCNF4VLz_wnGj-eewRE_QB-lqa0EDPlzHiGam5TT7g7M0TuGeXFTm23X8r_YqcL_7hs1Ncz3YaJmchK3DXzkKJqEwrpkCaTwoiYqtXLcEl0WAt5IwntyTn9XcC-xXM4Ppbdxr89TJ_k4w4eGr3Cwhs2DaQmYqbCJigAh3LXMUdim_Nv1Y87N2aVil1RE_1u4vV50WawtJy3CT5vTwxLHIkcHuC22cJVaVcFvipA1k7HclOBfvg3SnAnF6smpb5SCA7ogTzbzTEn93j-57VBGw7Vw9cwHKgE1vIKULvfsc-51ObhjZALbE7qvWh5kXoHp9DJIxzDTu69SB2W_KupQ7iou5Gqs9Ay6U6Uw-urY5sgTbT5BhA11BCWqaSioamFMNJ3Ka5U-bamC93M3fVM_cWP1MzQbcaaq5K9_IX0sUcttNoTFzapisrCpffMX77D4d7te_F1167Wk4BbJur_Qth7nApFX_9M54oxqz2Rza55Fzlgggmiw7LPds0NnRPVS2aUT0c3EcJTHfInXnN0ACpdzVN_kS3q5mWZar6BndOGuiCsjTCJ3_eYOGoudU490jV1aaQq13xezahrknT7eIZZ0Y9eWCvXCNVMjxxMz3eN57w28NQ7ffIBXYhMJtRb0F2mMONhRQkpuSUmbdRJZBkoZMAijrm9e3I11Tt9fGJdWxvbWwPzwq4iYidq1V5C7_Q10awpKlylerJ5otPtz9F2fDH6WqbG5xK4m-OQN-3c2k_gMzUk9sLngzuvr9YugEdwtgk9m1NN_L49-Y46J5HQAcx51JzZhz619saV9WunNuG3dDRdyLpx9NtbvNmM9AsTFUZPKZAXp-H2OL1at49btZvNoQSte5W6JaFmETPMyYHyRSj8jsjtuDxQeW2sr9YnIRCosxDehPD9xoWKO2xJnbixnR1l_SnSMdLphrsW-tRC0u28mxBfKjSrg5YP13y2oprGP63uPT-dnaiucDfYr_BGlF_36Eo8BIgbo6vOVlm3paDeW_rFrft-6BwPtwaa9ca8azu2cP9FFzLdkK1422s4KmJO64sLlqHfSTAhHcHuHVZfDXzfbOi9nPsdeikx29f3QC3i-PTsbXVKy7qw_t0-6JH6y_j4-PQH6AkTp5dlHv1wAr0elbftuYqjV4BeJvKpe-HP5HRHZxzHGU0u_Cs6TVB_oD4Hm7BZpxTfWydqg82j-_4PrwCRKw==))
209210
- [Host-bulk APIs](https://github.com/NVIDIA/cuCollections/blob/dev/examples/static_set/host_bulk_example.cu) (see [live example in godbolt](https://godbolt.org/clientstate/eJx9VgtvIjcQ_ivTraqSu-UVKTqJPFSapCq6EzmF3J1OpSLGa1grxqZ-wFHEf--MvcvjHk0kYD3jmW9mvs_rbeaEc9Jol_X-2mayyHrdPFNMzwObi6yX8VCwLM-cCZbTc_vVWMMruDXLjZXz0kODn8F55_y8iR8XOQw_Du4Gfbh9eHz_8Nh_GjwMW7QhbnonudBOFBB0ISz4UkB_yTh-VZYcPgpLaOC81YEGOYyzyjbOzi5jlI0JsGAb0MZDcALDSAczqQSIL1wsPUgN3CyWSjLNBaylL2OqKk6EA5-rIGbqGfoz3LHEp9mxJzC_h05_pffLXru9Xq9bLMJuGTtvq-Ts2u8Gt_fD0X0Toe-3fdAK2wtW_BOkxcKnG2BLRMbZFPEqtgZjgc2tQJs3hHxtpZd6noMzM79mVsQ4hXTeymnwJ82rcWL9xw7YPqaxcf0RDEbjDH7vjwajPMb5NHj68-HDE3zqPz72h0-D-xE8POKwhncDGhU-_QH94Wd4Oxje5SCwdZhKfFlaqgKhSmqrKFIPR0KcwJiZBMstBZczyaGmEczNSliNZcFS2IVMhEOQRYyj5EJ65uPaN8XFVO2xHuufpeYqFAKueOCm7WgLnzjhWzyUN197FAw9ivYsaE6Rmbo5tvvSBufbhVhhlslKcG9sq_yeizJznJb6vtHhXAWSrPV1fmlwHIItTjbFOl30bL9K_Pgt8rZE78k0qJeJ-MKwwwIrSuaplWIGd2KBvfGWeYEdctTRiqmHJuC8KQKOm6JB__3AHYT3hK5kjcuApEKOqA3SbWUSE2fWLGLAuBkHE50CaZWmWhiancHhVWNS8kXAs8T5WP-MxIhZnrnRpCb3HCkIhApxvojNAQpOUmqP0pO6sTKyOBvrLa5jKsrwVmzgGmH5S2oSQLsN94ul34BTxifgVhAZhfZJTfTbrvD3OKNFqYXCFqyYCsK1qG7kZXoCV5qgcBN2TSicOG5ygZdVHl8yTx3Ac0UgWcFwHiwJEo8b-l4GDwXzjCqJODmNhKQBgiBOsMxJDQGLaHYPNQzDYkohUy9I6AgiNU-QBHCMRa_n5L9i4o_i6rCYxA3XcNH5tdPpHCLe4vmGWgdOB5HEBk2Zq5SPvr-AMgwnx4jWtIMFzHkITNZJsmLsTuvi8rsgDtGvk5ELqRp7VO3jOGfH2IirgdPAIgfiCYzdVYJh0Oc66nM11TT6ZheYixSM7UydqvsZm06qR4B7xl_hFG4owbaOmFc--4Fsvx3NbneEFCWKTSSUScf7EW07OXRzOM-h1cpB7mhD0nyvd3JoJBC0Z9-Y-Jrae9ehG1EGUzFH4p_lSRRCF_S7c9S8QWQFdk6phATFYJIymSup2jgqPPQSf34Y9ijmCHHSmUFKRr0E5X9cztQYdYOeeA6fFFR3rBT8BeTsgI80WekeCYh6icfSAWZ9JvxP_TFbbTpKhncBOdskZe7zlWyFZ5kQOm0jV8JcMRbdIuRJNCJv6yrJYGaNk1R15goGvTOIX0h0WRBb_Ga7q-FgyY3T4GewrVRh8Gi4usITaBQ4xxflT_BHzF5jbo0xRnYJuxTKCh-sBlIzruDdii4r-BqwhytYplecd88vQhfNZunT_SxrYr5r_vp19w00meXltVtM3nSg2URVe_zwWIkomootpvHSpuT0KCbnXOHiKt2wcAFFql-yXV7bUTsndmRGtvs7_v8HAzB-mg==))
210211
- [Device-ref APIs for individual operations](https://github.com/NVIDIA/cuCollections/blob/dev/examples/static_set/device_ref_example.cu) (see [live example in godbolt](https://godbolt.org/clientstate/eJztWG1v4zYS_itTFcU5G_klQfdaeJPgfMkWNVokRZJtUdSFSlO0xYssqiJlxw3y3-8ZUrLsTbZogft4CZBYmuEzz7xwOPRTZJW12hQ2Gv_yFOk0Gp_EUS6KZS2WKhpHsk5FFEfW1JXk5-GbWUFv6NKU20ovM0c9eUSno9PTPv68jen6x-nVdEKXN7c_3NxO7qc31wNe4Bd9r6UqrEqpLlJVkcsUTUoh8a-RxPSjqpgNnQ5G1GOFWdTIZtHRO4-yNTWtxJYK46i2CjDa0kLnitSjVKUjXZA0qzLXopCKNtpl3lSD4-nQzw2ImTsBfYEVJZ4W-5ok3I46_2TOlePhcLPZDISnPTDVcpgHZTv8fnr5_vrufR_Ud8s-FDnCS5X6vdYVHJ9vSZRgJsUcfHOxIVORWFYKMmeY-abSThfLmKxZuI2olMdJtXWVntfuIHgtT_i_r4DwiQKBm9zR9G4W0b8nd9O72OP8NL3_9ubDPf00ub2dXN9P39_RzS2SdX015VTh6RuaXP9M302vr2JSCB1MqceyYi9AVXNYVRpieKfUAY2FCbRsqaReaEltGdHSrFVVwC0qVbXSoeBAMvU4uV5pJ5x_98I5b2o4K2bF57qQeZ0qOpO1NEPLS2RilRvIOrv4WCMV0EiHi7qQjCzyi325y6raumGq1rCSrJV0phpkr6nkZols5a8LLfKqUGSDF_aNgacguFbJsjJ1aV-qgF6qFgew2iCLSqy86vBNqKF_-dpuqFZqoSo2mahHgWQoOB-05pVWC7pSK4TRwbRCMC0HvynqLl4NVt9q2Jz8MLXdDt1TKiuzhgLShJ1W9M3G529nnzaZlhlJVNpc8T5sCtjBben8rvOIbFqagncZEruozMrLUOmBBYTpXpKHQ2BYVTmYZRYg_6C2loENXmXCZv59bZmNKXj9LtTkQ-3rUGF_khP2YQZGiBPigaxtS1WIlULlulu1iGn3YlqUtZsydxQCop8ky9zMRZ4ktDY6JYlsm1Wyn9ZAsxegmFN8iOJ5Yxu7dDy2-g-VOCqOZsUTXCW2adFCwH5J5_SyWt5xLIgDZx1vPxI1_JfLhJGwIlgdj5s3jbpXclwtwFyOx_wxTUpROc174KzRvuh5IdpmgjpWIk3muZEPvaOjBgfB_ueX4OvNUw52CXeXlHGX-H-lV4NH5NYvCw9D6qh0ADp9pMOfc-rtrWogpukjHo4psPFPRweIjIl6g2M9hjxDJMkHkjjwgyYV7G5Mb3q-YI7ZuPeItXjV8fm-K17wPCueGf1vl8je-5va_cXa8ZvA_r2KiT_CR3GjRf6_jv7ndTQ3Jm-Iwp-2Y6Uw5E-YNnl_VmML8uJBE4xKFIgFnZ_TCFZC4n7Bgl-BuW_iHZfhXyhSBAMjiy56XFVtBYQ--J3aMmjhGh_RRd-vSrclmxuHDl4pNG4-xFXhwhTCn6s1Ps8ifgkeOSaFtchrZQd0n0HcPJHNTJ2n3OWtynFSYpGtZdbYcZlw3OQxjykc8mSkrCseZDCm8X_ULqXCCW7xnmdXi4opJohk0lKAE_2TzofrejVnyOYMQFGCRNjsikeHg63S4Rb1KvELzunt6B-j0ahDvMRciBkJxxZ2jUaA5sI2ExN0v0DsRUoLwePAbiN0wCxNghTYo8Hbd6-S6NDPg1Aqnfd2rIb7OEf73PjgriUnrDvo_PiKEOdKAHkWtdjIVkhuqID-CQnrD1sfVQ4YtVH1oeeZCTR35_sZcnHBFp5axLjR2aXl6WWCnp_3-KLKEUo-p8MUtEvU0yimk5hOYxoMYtK-vMPENB4fjFyBBK_ZhSfspla7hfb7bTBXS5T_UexXDFSR8ufRXginYXTgMCx0hXhlIl-0A1A3R_hxSDmfvO74eMVE84SNvpe909cNWoXkpzuLXjnkRjRHAF1-uJpAUHU5-cRUcXZ2dnL6NYJ4-vXFxUWvO-kwfvVCloLinxONP0X7DrHn0ZAnJXSCOnefThE3xovQvQ6S1FZBpuQD9z6R58Fp7jaF2VDXQ9ENmpAP6No4FZrGRlEpLBd7N1R6gci5f255D-yajKLf2h78G4VwYWLfZYGWCuOlyOMm5G5j-LqyMr7ztehm_h_F26stAT6-u9kUl6d2bGVQgTvVwq907STa2rW8Cm2OZfmWr198bVl4X-cqE2vdcbvn22lq0Ef5vsqXPzgGVAJPGe5PTDZUBWt6Pb4v5aI8rJLg_ke1cVgVrdJHddEVQhwy2Qr2Eombt15s2ww0uYQvCi6pIixj1b2DEmoeNPFCdLu2glhgFr0DU63lZtvyDY37EdojDjp0F7d9et4NDjhKD8H5BA291CBNZ2fohHe1lLiWfkbfeOst58EMGJE_VBmqUq6uCuIzAG-iOOKvBnBKV90XHlGxlvLk9G19ArEpXfg2JOrD3rk8Pj75ivqiktm5XSVfjajfx1ng8MfBE5X2c7Ga-69Icj3fw5RS5ni5Dt9n4AVae_EQPcetHPk6kGPXRc-_-t__AoyhE5s=))
211212
- [One single storage for multiple sets](https://github.com/NVIDIA/cuCollections/blob/dev/examples/static_set/device_subsets_example.cu) (see [live example in godbolt](https://godbolt.org/clientstate/eJzNWYtOG0kW_ZU7XmllwNhANpuMAWtYIFlrIsgGMqPREPWUu8t2Lf3wVHXbeBD_vufWo93GTpSsZqU1MsbdVfdx7rmPah5bRhqjity0-r8-tlTS6h92WqnIJ5WYyFa_FVeJaHVapqh0zN97u3c57dJ5MVtqNZmW1I536Ojg6MU-fr3s0NVPw4vhGZ1ff3h__eHsdnh91eUNdtM7FcvcyISqPJGayqmks5mI8eHvdOgnqdkaOuoeUJsX3LX8vbvWzrGVsiwqysSS8qKkykiIUYbGKpUkH2I5K0nlFBfZLFUijyUtVDm1qrwcaw794oUUo1JgvcCOGb6NmytJlLXp_JqW5azf6y0Wi66wZncLPemlbrHpvRueX17dXO7D9HrbxzwFvKTl75XScHy0JDGDZbEYwd5ULKjQJCZa4l5ZsOULrUqVTzpkinG5EFpaOYkypVajqlwDL9gJ_5sLAJ_IAdzZDQ1v7lr0j7Ob4U3Hyvl5ePvP64-39PPZhw9nV7fDyxu6_oBgXV0MOVT49obOrn6hH4dXFx2SgA6q5MNMsxcwVTGsMnEY3ki5Zsa4cGaZmYzVWMUUaESTYi51DrdoJnWmHOFgZGLlpCpTpSjttQ3nrKreXX6X_0XlcVolkk7iKi56hrfEkZFlpOW4G1fTwZY1hYZ-f3P9diJwO-kJrcVysPXWuMpjtkqka_fLqa5M2UvkHBZGcxlDSXe6bQkiXsVy-z0Ti7y7YVVRACD4NZfRRBfVzGwsEemkAEWm2brNsDeR47VrqgAlpFhfmFeZ1Cq2Qnu7jqQ_2OTx_phqBEhNJB8EYs3QuTUjreSYLmSGKJUwURqaFgsmLedgkUsaVek9YS951PleDANKSVmVlgrSyEvn0DMVwJjMild5ouYqqURKHgEmw1wJb9a-UbAecaaz90Ozqii3BdaX4M8fUALb9BLmQDe4a1ko0nRJi6nMIUekTEBbDsBocAsoUyJKQVhVxFanNSxYazVMhZmyyR3UiJkWIEQMI02RVna9yudFOgcYEmgVS9YgyOAjDYB4MDg5JjK3vmGRB8Il0i1XMMlpkFtgmf45lwTeZORMaAui8--ZsexXfYHXS1QmVLOc65rUXSvcagHhaISiFk-VnLtaVLGlVl3KtXwhbUXPi3y_WNh0ZcTL5UyuEP8BZVd6ix1FuPyw4qTmBpsyq_SsQFkENdJll4YlL-OSrfJSIsltvTOWQlCfgatWvCeFyEtaoDxjTVLYFUFZzf9VYRAVM411c6WieBIZ5gO_Tun1MT56vd4JoSl9vMCvVY7RW84xrvqvoQNUTQxrnAJX7iYMpIvTho5RFd-j8Fg9p3RY67iqshHqFyRibVxpLeGISQtQ3km1sFvJTuGG5CtavSD54HhDskxlBrHGNQwjdWmJ8Hsl9ZLhcEG9l8uIIwchQDxI-VEubTzDqpkuRviMDLpZJv0GAEtcPvt9ZIwUOvKrTjyy3Eq2v9wuFCKBFIo4daJQRE-CQYNBMOaWtTFTdZEaOn9LEy3yKhUI7_KzKr76ZVXYOuOsJ-cjtZ1Tf5KCIHzeNV1QteK2zn7j2g4qbK_nvETYbDVo5KovDCES_muImUMy0MzdqyHsNPk3OHZ63m3P4FB_QiY_14frQSd_5AIQNW3p98OK47C13hJewdz1lrwy91ux5g7c77sEATWRr5FrA_-lJDTHfh8jmEijslgR8ZulbcmWb5bxHPc6G27QOVdBcjG9cTXPNqmt2R55YKKoWQBXTtvppsGbq4ETdkqPhx160SFM7K869H2HDvH9EBcOceUQlw6_f_LEusxm5dIXMcyjMJLHQVQgV8z4b8395K7FF5FcKWbOuUgrabj74Lb_xuW-ShNuQgZFLGYBpoqnTk05FSVXegz2aE-odDHqJ0_EmPf5c1aV1nbU_bq2rXyWbGTEN4IR8HH_8HhtznEzzNCiCGsa4KJEFvVwUjfGxjhGdhyru-AlV_DNTuLGHUMKUpB_XqINmPJaf7v6ram50Vi5zWfkk8fQ-4I7pea4c_-zkeQ64mUWo38DQeObYBRN0mIEfkc0L1TQ1g4k263Foig9MmU5zw0OMcBwwvm7MXha5IhW3YlKnhKxdILUxJ9JBINLZWu7bwyDtr2J2SDyyTtCubtv79iTG2hOb3k8dA60MTKcv93h0U8-PFOlkgdoatvdFyrrPgAf-2WYPODLnm-e9tsO9ULLb9qsxSIUIk67U9pt19DusQJnk13r0KqXnzY3d7VEzieRw6fQpu1qnduz41XCNUcrG1_u0CXmV8sqeyKCv3bwRJNzG3kTD01trCEFlWj0itDm8bG3t0OPrq6sW9b1YWX4O5Y-v6pPzo-nu_xpC9fP0tTLQK5ZpvspcFxU7vT1JTpracOhKxDtOacZqJEw7rhpffSNxtJYgrmrAx7SGedB5IX4ojn_o1wYI3z_Z5nwjOp_Kte_yHTG4tt4zjsaLP8gDUY7zPoY5blEqjGiXD84WY-tH_gD1SiKzBQNJEFgmPXairK2QUq74SadIh-QA36Jy44nL2KJedLN6u1g11ckEkz_F7fM9XRcs9ctbITGGg6JTdC6lk1bEtCjExc6YXc20cBUCKbLfIUHlJVFpuJr3f6r87RDu07pd6cb6f055z-DXW3T0BnjoURMDKxP6aCzJRu5vdepSE52iIEPyUwD6HH7rnVTxbE05jt6Yy1eExaOKN072Nja8cELNYojleF02g4pCCtXx5vQhREGFAbXUZP1pLEdP68yPiD9PbSWy9VxzT7ZmwrUMUGJGo-lPYbxQzhp7NCB_Nki0W222WXcKYjHtXqKsn_yzQhxgvbB4xFAbL5fPHv_7dn75dr7qZnCmJBUElQ7re7JUlPtoO3Y0Fjc9eNXGwatpYPb0cwIrDimvT1Vk6Mphh9foAZGI4EqFWZaP8_HwpTrZrjSkIl7bHAnEfmAU315Uk-17SaYTOOdmsj88TkHQYAxR5_dQfHCTHrQKD6YO8fqAXHK7LOlIsNMKMMWO2WVRSlS9tSTyVlnapUeFX8yj4zl0MHxCrXGogZ0TaT4N-KwhmRT3t5pczlc9-XBm_mrYr8-2TNTvakJDY_C273g5LXHR1DYzcrE4QrFt8aB2fq8Y7HECBKjIOs0rO_akDdQPnfP7LY_xqqMf4qNdPeZWqsyq6Oq5fDqEPm4of8ppO0wR-MEXn_4515BQP3YfoJOjKkjHC04kis9mIjC9vbmESA41WRbzdB6EFh57p9WNvz6Eik28mnjSN248LjOic6aE1x72zvgRc2RT0-eNcHI7QkaND26hKwRWJ1xHzdReerQY-PdMPJpLUfdg2p-nNN40N3Ar-6Jpp43NsfhxlHHNit79eTkhE-bR68Hg0F7Jcbj0J3IsnFkeKOed5cgjFvx14ri9VqWlc5tusPFVqfFFQSdXK_-99XK53F8ePSyOsRtfrJs_zHW2gcFTuO9vcNXtC90PD01WfTqgPb30TfKfVv7EpnspyIb2f-WpWrUkBnHcYqLc_evLVzARJ3ft5464T6Ct3YfiLeePtmf_wC0RUv3))

examples/CMakeLists.txt

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#=============================================================================
2-
# Copyright (c) 2018-2024, NVIDIA CORPORATION.
2+
# Copyright (c) 2018-2025, NVIDIA CORPORATION.
33
#
44
# Licensed under the Apache License, Version 2.0 (the "License");
55
# you may not use this file except in compliance with the License.
@@ -33,17 +33,23 @@ endfunction(ConfigureExample)
3333
### Example sources ###############################################################################
3434
###################################################################################################
3535

36-
ConfigureExample(STATIC_SET_HOST_BULK_EXAMPLE "${CMAKE_CURRENT_SOURCE_DIR}/static_set/host_bulk_example.cu")
3736
ConfigureExample(STATIC_SET_DEVICE_REF_EXAMPLE "${CMAKE_CURRENT_SOURCE_DIR}/static_set/device_ref_example.cu")
3837
ConfigureExample(STATIC_SET_DEVICE_SUBSETS_EXAMPLE "${CMAKE_CURRENT_SOURCE_DIR}/static_set/device_subsets_example.cu")
39-
ConfigureExample(STATIC_SET_SHARED_MEMORY_EXAMPLE "${CMAKE_CURRENT_SOURCE_DIR}/static_set/shared_memory_example.cu")
38+
ConfigureExample(STATIC_SET_HETEROGENEOUS_LOOKUP_EXAMPLE "${CMAKE_CURRENT_SOURCE_DIR}/static_set/heterogeneous_lookup_example.cu")
39+
ConfigureExample(STATIC_SET_HOST_BULK_EXAMPLE "${CMAKE_CURRENT_SOURCE_DIR}/static_set/host_bulk_example.cu")
4040
ConfigureExample(STATIC_SET_MAPPING_TABLE_EXAMPLE "${CMAKE_CURRENT_SOURCE_DIR}/static_set/mapping_table_example.cu")
41-
ConfigureExample(STATIC_MULTISET_HOST_BULK_EXAMPLE "${CMAKE_CURRENT_SOURCE_DIR}/static_multiset/host_bulk_example.cu")
41+
ConfigureExample(STATIC_SET_SHARED_MEMORY_EXAMPLE "${CMAKE_CURRENT_SOURCE_DIR}/static_set/shared_memory_example.cu")
42+
4243
ConfigureExample(STATIC_MAP_HOST_BULK_EXAMPLE "${CMAKE_CURRENT_SOURCE_DIR}/static_map/host_bulk_example.cu")
4344
ConfigureExample(STATIC_MAP_DEVICE_SIDE_EXAMPLE "${CMAKE_CURRENT_SOURCE_DIR}/static_map/device_ref_example.cu")
4445
ConfigureExample(STATIC_MAP_CUSTOM_TYPE_EXAMPLE "${CMAKE_CURRENT_SOURCE_DIR}/static_map/custom_type_example.cu")
4546
ConfigureExample(STATIC_MAP_COUNT_BY_KEY_EXAMPLE "${CMAKE_CURRENT_SOURCE_DIR}/static_map/count_by_key_example.cu")
47+
48+
ConfigureExample(STATIC_MULTISET_HOST_BULK_EXAMPLE "${CMAKE_CURRENT_SOURCE_DIR}/static_multiset/host_bulk_example.cu")
49+
4650
ConfigureExample(STATIC_MULTIMAP_HOST_BULK_EXAMPLE "${CMAKE_CURRENT_SOURCE_DIR}/static_multimap/host_bulk_example.cu")
51+
4752
ConfigureExample(HYPERLOGLOG_HOST_BULK_EXAMPLE "${CMAKE_CURRENT_SOURCE_DIR}/hyperloglog/host_bulk_example.cu")
4853
ConfigureExample(HYPERLOGLOG_DEVICE_REF_EXAMPLE "${CMAKE_CURRENT_SOURCE_DIR}/hyperloglog/device_ref_example.cu")
54+
4955
ConfigureExample(BLOOM_FILTER_HOST_BULK_EXAMPLE "${CMAKE_CURRENT_SOURCE_DIR}/bloom_filter/host_bulk_example.cu")
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
/*
2+
* Copyright (c) 2025, NVIDIA CORPORATION.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
#include <cuco/static_set.cuh>
18+
19+
#include <cuda/std/string_view>
20+
#include <thrust/device_vector.h>
21+
22+
#include <iostream>
23+
24+
/**
25+
* @file heterogeneous_lookup_example.cu
26+
*
27+
* @brief Demonstrates how to use hash set as a lookup table of the original data with string keys
28+
*
29+
* @note This example is for demonstration purposes only. It is not intended to show the most
30+
* performant way to do the example algorithm.
31+
*/
32+
33+
/**
34+
* @brief User-defined key equal to compare two keys
35+
*/
36+
struct my_equal {
37+
my_equal(cuda::std::string_view* data) : _data{data} {}
38+
/**
39+
* @brief Checks if two keys are identical based on their indices in the
40+
* original data array
41+
*/
42+
__device__ constexpr bool operator()(int32_t lhs, int32_t rhs) const
43+
{
44+
return this->operator()(_data[lhs], rhs);
45+
}
46+
47+
__device__ constexpr bool operator()(cuda::std::string_view lhs_str, int32_t rhs) const
48+
{
49+
auto rhs_str = _data[rhs];
50+
51+
// First check if lengths are the same
52+
if (lhs_str.size() != rhs_str.size()) return false;
53+
54+
// Then compare each character
55+
for (size_t i = 0; i < lhs_str.size(); ++i) {
56+
if (lhs_str[i] != rhs_str[i]) return false;
57+
}
58+
59+
return true;
60+
}
61+
cuda::std::string_view* _data;
62+
};
63+
64+
/**
65+
* @brief User-defined hash function to hash the original data based on its index
66+
*
67+
* @tparam T Original key type
68+
*/
69+
struct my_hasher {
70+
my_hasher(cuda::std::string_view* data) : _data{data} {}
71+
__device__ uint32_t operator()(int32_t index) const
72+
{
73+
auto str = _data[index];
74+
return this->operator()(str);
75+
}
76+
77+
__device__ uint32_t operator()(cuda::std::string_view str) const
78+
{
79+
uint32_t hash = 0;
80+
// Naive string hash function
81+
hash = str[0] + str.size();
82+
83+
return hash;
84+
}
85+
cuda::std::string_view* _data;
86+
};
87+
88+
int main(void)
89+
{
90+
// The original key type is a string, which is variable length and larger than 8 bytes
91+
using Key = std::string;
92+
93+
auto input =
94+
thrust::device_vector<cuda::std::string_view>{"apple", "apple", "banana", "cherry", "apple"};
95+
96+
auto const size = input.size();
97+
98+
// The actual key type is an index type, `int32_t` is large enough to cover the whole input range
99+
// and 4-byte atomic CAS is more efficient than the 8-byte one.
100+
using ActualKey = int32_t;
101+
// `-1` is a valid sentinel value since one will never access `data[-1]`
102+
ActualKey constexpr empty_key_sentinel = -1;
103+
104+
auto const data_ptr = input.data().get();
105+
auto set = cuco::static_set{cuco::extent<std::size_t>{size * 2}, // about 50% load factor
106+
cuco::empty_key{empty_key_sentinel},
107+
my_equal{data_ptr},
108+
cuco::linear_probing<1, my_hasher>{my_hasher{data_ptr}}};
109+
110+
// The actual keys are indices of elements
111+
auto const actual_keys = thrust::device_vector<ActualKey>{0, 1, 2, 3, 4};
112+
set.insert(actual_keys.begin(), actual_keys.end());
113+
114+
auto query = thrust::device_vector<cuda::std::string_view>{"lychee", "cherry", "apple"};
115+
auto const query_size = query.size();
116+
117+
auto contained = thrust::device_vector<bool>(query_size);
118+
set.contains(query.begin(), query.end(), contained.begin());
119+
120+
for (auto const& it : contained) {
121+
std::cout << it << "\n";
122+
}
123+
124+
return 0;
125+
}

0 commit comments

Comments
 (0)