{"about":{"site":"https://codewithpapers.app","non_affiliation":"Code with Papers and Syntology are not affiliated with, endorsed by, or sponsored by Papers with Code, Meta, or the pwc-archive mirror.","licence":"CC BY-SA 4.0","licence_url":"https://creativecommons.org/licenses/by-sa/4.0/legalcode","attribution":"https://codewithpapers.app/attribution","modified":"archive material modified by Syntology; see the attribution page"},"url":"/paper/cagra-highly-parallel-graph-construction-and","title":"CAGRA: Highly Parallel Graph Construction and Approximate Nearest Neighbor Search for GPUs","arxiv_id":"2308.15136","date":"2023-08-29","proceeding":null,"authors":["Hiroyuki Ootomo","Akira Naruse","Corey Nolet","Ray Wang","Tamas Feher","Yong Wang"],"abstract":"Approximate Nearest Neighbor Search (ANNS) plays a critical role in various disciplines spanning data mining and artificial intelligence, from information retrieval and computer vision to natural language processing and recommender systems. Data volumes have soared in recent years and the computational cost of an exhaustive exact nearest neighbor search is often prohibitive, necessitating the adoption of approximate techniques. The balanced performance and recall of graph-based approaches have more recently garnered significant attention in ANNS algorithms, however, only a few studies have explored harnessing the power of GPUs and multi-core processors despite the widespread use of massively parallel and general-purpose computing. To bridge this gap, we introduce a novel parallel computing hardware-based proximity graph and search algorithm. By leveraging the high-performance capabilities of modern hardware, our approach achieves remarkable efficiency gains. In particular, our method surpasses existing CPU and GPU-based methods in constructing the proximity graph, demonstrating higher throughput in both large- and small-batch searches while maintaining compatible accuracy. In graph construction time, our method, CAGRA, is 2.2~27x faster than HNSW, which is one of the CPU SOTA implementations. In large-batch query throughput in the 90% to 95% recall range, our method is 33~77x faster than HNSW, and is 3.8~8.8x faster than the SOTA implementations for GPU. For a single query, our method is 3.4~53x faster than HNSW at 95% recall.","url_abs":"https://arxiv.org/abs/2308.15136v2","url_pdf":"https://arxiv.org/pdf/2308.15136v2.pdf","source":{"archive":"pwc-archive (Hugging Face), CC BY-SA 4.0","snapshot":"2025-07-28","licence_url":"https://creativecommons.org/licenses/by-sa/4.0/legalcode","row_kind":"abstracts"},"code_links":[{"paper_slug":"cagra-highly-parallel-graph-construction-and","repo_url":"https://github.com/rapidsai/raft","is_official":1,"mentioned_in_paper":1,"mentioned_in_github":0,"framework":"pytorch","reach":{"status":"ok","spdx":"Apache-2.0"}},{"paper_slug":"cagra-highly-parallel-graph-construction-and","repo_url":"https://github.com/rapidsai/cuvs","is_official":0,"mentioned_in_paper":0,"mentioned_in_github":1,"framework":"none","reach":{"status":"ok","spdx":"Apache-2.0"}}],"tasks":[{"task_slug":null,"task_name":"CPU"},{"task_slug":null,"task_name":"GPU"},{"task_slug":"information-retrieval","task_name":"Information Retrieval"},{"task_slug":"recommendation-systems","task_name":"Recommendation Systems"},{"task_slug":"graph-construction","task_name":"graph construction"}],"methods":[],"datasets_introduced":[],"methods_introduced":[],"results":[],"syntology":{"atlas_url":"https://app.syntology.ai/?focus=2308.15136","mcp":{"get_harvested_code_for_paper":{"arxiv_id":"2308.15136"}},"developers":"https://syntology.ai/developers","read_at":"2026-09-24T18:15:14+00:00","read_at_is":"when the build read Syntology's graph, not when any sample ran","claim":"Per-sample execution status on synthesized fixtures; not a correctness claim about the paper. Samples come from repositories linked to the paper, official or community; repo_kind says which.","repos":[{"provenance":"external:paperswithcode_snapshot_2025-07-28","url":"https://github.com/rapidsai/raft","reach":{"status":"ok","spdx":"Apache-2.0"}},{"provenance":"external:paperswithcode_snapshot_2025-07-28","url":"https://github.com/rapidsai/cuvs","reach":{"status":"ok","spdx":"Apache-2.0"}}],"summary":{"ran":3,"unverified":9},"by_repo_kind":{"official":{"samples":4,"ran":3,"repositories":1},"listed":{"samples":8,"ran":0,"repositories":1}},"repo_kind_vocabulary":{"official":"The archive marks this repository official for the paper","named_in_paper":"The archive records that the paper mentions this repository; it is not marked official","listed":"In the archive's code links for this paper, not marked official and not recorded as mentioned in the paper","found_in_text":"Syntology found this repository in the paper's own text; whether it is the authors' implementation is not asserted","community":"Not in the archive's code links for this paper; a community repository Syntology harvested"},"n_pointer_only_for_licence":8,"samples":[{"code_sha256_prefix":"61e08a7e9b102edc","entry":"get_raft_comm_state","repo":"rapidsai/raft","repo_kind":"official","path":"python/raft-dask/raft_dask/common/comms.py","file_url":"https://github.com/rapidsai/raft/blob/HEAD/python/raft-dask/raft_dask/common/comms.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"61e08a7e9b102edc"}},{"code_sha256_prefix":"a6c03b255c7f286e","entry":"local_handle","repo":"rapidsai/raft","repo_kind":"official","path":"python/raft-dask/raft_dask/common/comms.py","file_url":"https://github.com/rapidsai/raft/blob/HEAD/python/raft-dask/raft_dask/common/comms.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"a6c03b255c7f286e"}},{"code_sha256_prefix":"ecd325143e42f86b","entry":"parse_host_port","repo":"rapidsai/raft","repo_kind":"official","path":"python/raft-dask/raft_dask/common/utils.py","file_url":"https://github.com/rapidsai/raft/blob/HEAD/python/raft-dask/raft_dask/common/utils.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"ecd325143e42f86b"}},{"code_sha256_prefix":"b805cbcdf347d91b","entry":"choose_random_queries","repo":"rapidsai/cuvs","repo_kind":"listed","path":"python/cuvs_bench/cuvs_bench/generate_groundtruth/__main__.py","file_url":"https://github.com/rapidsai/cuvs/blob/HEAD/python/cuvs_bench/cuvs_bench/generate_groundtruth/__main__.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":false,"mcp_get_code":{"code_sha256":"b805cbcdf347d91b"}},{"code_sha256_prefix":"a8203568aae7ab37","entry":"dtype_from_filename","repo":"rapidsai/cuvs","repo_kind":"listed","path":"python/cuvs_bench/cuvs_bench/backends/_utils.py","file_url":"https://github.com/rapidsai/cuvs/blob/HEAD/python/cuvs_bench/cuvs_bench/backends/_utils.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":false,"mcp_get_code":{"code_sha256":"a8203568aae7ab37"}},{"code_sha256_prefix":"5e6889d7e7f8fe19","entry":"expand_param_grid","repo":"rapidsai/cuvs","repo_kind":"listed","path":"python/cuvs_bench/cuvs_bench/backends/_utils.py","file_url":"https://github.com/rapidsai/cuvs/blob/HEAD/python/cuvs_bench/cuvs_bench/backends/_utils.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":false,"mcp_get_code":{"code_sha256":"5e6889d7e7f8fe19"}},{"code_sha256_prefix":"47f3b6ffa867c7d2","entry":"generate_random_queries","repo":"rapidsai/cuvs","repo_kind":"listed","path":"python/cuvs_bench/cuvs_bench/generate_groundtruth/__main__.py","file_url":"https://github.com/rapidsai/cuvs/blob/HEAD/python/cuvs_bench/cuvs_bench/generate_groundtruth/__main__.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":false,"mcp_get_code":{"code_sha256":"47f3b6ffa867c7d2"}},{"code_sha256_prefix":"57e66bf359c19c79","entry":"get_search_space","repo":"rapidsai/cuvs","repo_kind":"listed","path":"python/cuvs_bench/cuvs_bench/backends/search_spaces.py","file_url":"https://github.com/rapidsai/cuvs/blob/HEAD/python/cuvs_bench/cuvs_bench/backends/search_spaces.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":false,"mcp_get_code":{"code_sha256":"57e66bf359c19c79"}},{"code_sha256_prefix":"a215ace470bb8f6e","entry":"import_with_fallback","repo":"rapidsai/cuvs","repo_kind":"listed","path":"python/cuvs_bench/cuvs_bench/generate_groundtruth/__main__.py","file_url":"https://github.com/rapidsai/cuvs/blob/HEAD/python/cuvs_bench/cuvs_bench/generate_groundtruth/__main__.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":false,"mcp_get_code":{"code_sha256":"a215ace470bb8f6e"}},{"code_sha256_prefix":"06b136bd9d1ae767","entry":"read_bin_header","repo":"rapidsai/cuvs","repo_kind":"listed","path":"python/cuvs_bench/cuvs_bench/_bin_format.py","file_url":"https://github.com/rapidsai/cuvs/blob/HEAD/python/cuvs_bench/cuvs_bench/_bin_format.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":false,"mcp_get_code":{"code_sha256":"06b136bd9d1ae767"}},{"code_sha256_prefix":"36f6b3bde8db7a57","entry":"set_nccl_root","repo":"rapidsai/raft","repo_kind":"official","path":"python/raft-dask/raft_dask/common/comms.py","file_url":"https://github.com/rapidsai/raft/blob/HEAD/python/raft-dask/raft_dask/common/comms.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"36f6b3bde8db7a57"}},{"code_sha256_prefix":"e11971f562a6c65d","entry":"write_bin_header","repo":"rapidsai/cuvs","repo_kind":"listed","path":"python/cuvs_bench/cuvs_bench/_bin_format.py","file_url":"https://github.com/rapidsai/cuvs/blob/HEAD/python/cuvs_bench/cuvs_bench/_bin_format.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":false,"mcp_get_code":{"code_sha256":"e11971f562a6c65d"}}]},"arxiv_metadata":null,"syntology_extracted_results":null}