Skip to content

Add filter_join_indices_output_size - #22694

Merged
rapids-bot[bot] merged 12 commits into
mainfrom
add-filter-join-indices-size
Jun 9, 2026
Merged

Add filter_join_indices_output_size#22694
rapids-bot[bot] merged 12 commits into
mainfrom
add-filter-join-indices-size

Conversation

@PointKernel

@PointKernel PointKernel commented May 28, 2026

Copy link
Copy Markdown
Member

Description

Required by #22124

This PR introduces a new API, filter_join_indices_output_size, which returns the output size of filter_join_indices without materializing the join indices output.

Checklist

  • I am familiar with the Contributing Guidelines.
  • New or existing tests cover these changes.
  • The documentation is up to date with these changes.

@copy-pr-bot

copy-pr-bot Bot commented May 28, 2026

Copy link
Copy Markdown

Auto-sync is disabled for draft pull requests in this repository. Workflows must be run manually.

Contributors can view more details about this message here.

@github-actions github-actions Bot added libcudf Affects libcudf (C++/CUDA) code. CMake CMake build issue labels May 28, 2026
@PointKernel

Copy link
Copy Markdown
Member Author

/ok to test 046f944

@PointKernel PointKernel added feature request New feature or request non-breaking Non-breaking change labels May 28, 2026
@PointKernel PointKernel changed the title Add filter join indices size Add filter_join_indices_size May 28, 2026
@PointKernel

PointKernel commented May 28, 2026

Copy link
Copy Markdown
Member Author

Could use some help and advice on the naming here. The existing filter_join_indices API clearly communicates its intent: it takes join indices as input and returns the indices that satisfy the filtering predicate.

For this new API, the goal is to return the number of output elements produced by filter_join_indices (i.e., the size of its output) without materializing the result itself. Naming it with a _size suffix is consistent with existing join APIs e.g. inner_join_size computes the output size of inner_join.

However, this creates an odd situation where the intent of the API becomes fairly obscure from the name alone. Any suggestions? filter_join_indices_output_size seems to be a good option.

Updates: switched to filter_join_indices_output_size

@PointKernel
PointKernel marked this pull request as ready for review May 28, 2026 21:05
@PointKernel
PointKernel requested review from a team as code owners May 28, 2026 21:05
@PointKernel
PointKernel requested review from lamarrr and vyasr May 28, 2026 21:05
@coderabbitai

coderabbitai Bot commented May 28, 2026

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 61fd6a28-86a7-412c-aab6-35d27701bab8

📥 Commits

Reviewing files that changed from the base of the PR and between 1095922 and 0a13019.

📒 Files selected for processing (3)
  • cpp/CMakeLists.txt
  • cpp/include/cudf/join/join.hpp
  • cpp/src/join/filter_join_indices/filter_join_indices.cu
🚧 Files skipped from review as they are similar to previous changes (2)
  • cpp/include/cudf/join/join.hpp
  • cpp/src/join/filter_join_indices/filter_join_indices.cu

📝 Walkthrough

Summary by CodeRabbit

  • New Features

    • Added filter_join_indices_output_size() to compute join output sizes for INNER_JOIN, LEFT_JOIN, and FULL_JOIN without materializing index vectors.
  • Bug Fixes

    • Improved error detection to surface CUDA kernel launch failures during join processing.
  • Tests

    • Added tests that validate the new output-size computation matches the materialized join results.

Walkthrough

Adds a public API filter_join_indices_output_size with host-side orchestration and a new GPU kernel/launcher to compute exact join-filtered output sizes per join kind; exposes explicit template instantiations, updates include paths and CMake source layout, and adds tests asserting the computed size matches materialized results.

Changes

Filter Join Indices Size API Implementation

Layer / File(s) Summary
Public API contract and documentation
cpp/include/cudf/join/join.hpp
Declares filter_join_indices_output_size with join-kind-specific sizing semantics and documents validation errors and Boolean-predicate requirement.
Output size kernel implementation
cpp/src/join/filter_join_indices/filter_join_indices_output_size_kernel.cuh
Implements filter_join_indices_output_size_kernel counting predicate-passing pairs per join kind with per-thread iteration, CUB block reduction, and device atomic accumulation; records left-side passing marks for LEFT_JOIN. Adds launch_filter_output_size_kernel launcher.
Kernel launcher interface declaration
cpp/src/join/filter_join_indices/filter_join_indices_output_size_kernel.hpp
Declares templated launch_filter_output_size_kernel<has_nulls,has_complex_type> with documented per-join-kind counting and left_passing_marks behavior.
Explicit kernel template instantiations
cpp/src/join/filter_join_indices/filter_join_indices_output_size_kernel_*.cu
Four compilation units instantiate the launcher for primitive/complex × null/no-null combinations.
Host-side orchestration and public wrapper
cpp/src/join/filter_join_indices/filter_join_indices.cu
Adds detail::filter_join_indices_output_size that validates inputs/join kind, parses predicate enforcing Boolean output, allocates device counter and optional LEFT_JOIN marks, dispatches the appropriate launcher, computes final size, and exposes a public wrapper.
Include path updates and kernel error check
cpp/src/join/filter_join_indices/*, cpp/src/join/filter_join_indices/filter_join_indices_kernel.cuh
Switches kernel and JIT includes to fully-qualified join/filter_join_indices/ paths and adds cudaGetLastError() checks after kernel launches.
Build system and source layout updates
cpp/CMakeLists.txt
Replaces flat filter_join_indices*.cu entries with src/join/filter_join_indices/ sources (including output-size kernel variants) and reorders src/join/ sources (mark_join.cu moved after key_remapping.cu).
Test assertions for API correctness
cpp/tests/join/mixed_join_tests.cu
Adds assertions verifying filter_join_indices_output_size(...) equals the row count produced by materialized filter_join_indices(...) for INNER_JOIN, LEFT_JOIN, and FULL_JOIN.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • rapidsai/cudf#22654: Related JIT join-filter kernel refactor aligning JIT plumbing and kernel launch flow.

Suggested labels

3 - Ready for Review

Suggested reviewers

  • vyasr
  • wence-
  • bdice
  • galipremsagar
  • devavret
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 14.29% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely summarizes the main change: the addition of a new filter_join_indices_output_size API function.
Description check ✅ Passed The description is directly related to the changeset, explaining the purpose of the new API and noting its dependency on issue #22124.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch add-filter-join-indices-size

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 5

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@cpp/include/cudf/join/join.hpp`:
- Around line 378-386: The declaration of the non-void, side-effect-free API
filter_join_indices_size should be marked [[nodiscard]]; update the function
prototype for filter_join_indices_size (the overload taking cudf::table_view
left/right, device_span left_indices/right_indices, cudf::ast::expression
predicate, cudf::join_kind join_kind, and optional stream/mr) to include the
[[nodiscard]] attribute so callers are warned if the returned size is ignored.

In `@cpp/src/join/filter_join_indices/filter_join_indices_size_kernel.cuh`:
- Around line 87-90: The INNER_JOIN size path currently requires both_valid
before incrementing thread_local_count in the switch (case
cudf::join_kind::INNER_JOIN), which causes undercounting of preserved
JoinNoMatch pass-through pairs; update the check so that thread_local_count is
incremented when predicate_pass is true (remove the both_valid requirement) so
filter_join_indices_size matches the behavior of filter_join_indices and the
materialized path for INNER_JOIN.
- Around line 132-142: The kernel launch of filter_join_indices_size_kernel
(invoked from launch_filter_size_kernel) lacks an immediate CUDA error check;
add a post-launch check that captures launch failures by calling the appropriate
CUDA error-check helper used in this codebase (e.g., CUDA_TRY / CUDA_CHECK or
checking cudaGetLastError()) right after the <<<...>>> launch and log/propagate
the error (or abort) immediately; if a stream is used, also consider checking
the stream via cudaStreamSynchronize(stream.value()) or cudaGetLastError() on
the stream to ensure shared-memory/launch configuration errors are caught early.

In `@cpp/src/join/filter_join_indices/filter_join_indices.cu`:
- Around line 394-396: The current fixed DEFAULT_JOIN_BLOCK_SIZE can request
more threads or dynamic shared memory than the device supports (config and
shmem_per_block), so before computing detail::grid_1d config(...) and
shmem_per_block use device properties to bound both the block size and dynamic
shared memory: query cudaDeviceProp.maxThreadsPerBlock and .sharedMemPerBlock,
choose block_size = max(1, min(DEFAULT_JOIN_BLOCK_SIZE, maxThreadsPerBlock,
left_indices.size())), compute shmem_per_block = min(parser.shmem_per_thread *
block_size, maxSharedMemPerBlock) and ensure grid_1d is constructed with that
block_size and that the launch uses the capped shmem_per_block; also validate
non-zero threads/blocks and fail gracefully if requirements exceed device
limits.
- Line 398: The temporary device counter is being allocated with the passed-in
memory_resource (mr) instead of the current device resource; change the
allocation of the device_scalar (d_count) to use
cudf::get_current_device_resource_ref() as the memory resource argument so
internal temp workspace uses the current device resource (i.e., update the
device_scalar<std::size_t> d_count(...) call to pass
cudf::get_current_device_resource_ref() and keep the same stream and size).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: a598a257-f1bd-4943-bdee-fd2255779779

📥 Commits

Reviewing files that changed from the base of the PR and between 7a9a1db and 046f944.

📒 Files selected for processing (18)
  • cpp/CMakeLists.txt
  • cpp/include/cudf/join/join.hpp
  • cpp/src/join/filter_join_indices/filter_join_indices.cu
  • cpp/src/join/filter_join_indices/filter_join_indices_jit.cu
  • cpp/src/join/filter_join_indices/filter_join_indices_jit_kernel.cuh
  • cpp/src/join/filter_join_indices/filter_join_indices_kernel.cuh
  • cpp/src/join/filter_join_indices/filter_join_indices_kernel.hpp
  • cpp/src/join/filter_join_indices/filter_join_indices_kernel_complex.cu
  • cpp/src/join/filter_join_indices/filter_join_indices_kernel_null_complex.cu
  • cpp/src/join/filter_join_indices/filter_join_indices_kernel_null_primitive.cu
  • cpp/src/join/filter_join_indices/filter_join_indices_kernel_primitive.cu
  • cpp/src/join/filter_join_indices/filter_join_indices_size_kernel.cuh
  • cpp/src/join/filter_join_indices/filter_join_indices_size_kernel.hpp
  • cpp/src/join/filter_join_indices/filter_join_indices_size_kernel_complex.cu
  • cpp/src/join/filter_join_indices/filter_join_indices_size_kernel_null_complex.cu
  • cpp/src/join/filter_join_indices/filter_join_indices_size_kernel_null_primitive.cu
  • cpp/src/join/filter_join_indices/filter_join_indices_size_kernel_primitive.cu
  • cpp/tests/join/mixed_join_tests.cu

Comment thread cpp/include/cudf/join/join.hpp Outdated
Comment thread cpp/src/join/filter_join_indices/filter_join_indices_size_kernel.cuh Outdated
Comment thread cpp/src/join/filter_join_indices/filter_join_indices.cu
Comment thread cpp/src/join/filter_join_indices/filter_join_indices.cu Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

♻️ Duplicate comments (1)
cpp/src/join/filter_join_indices/filter_join_indices.cu (1)

393-394: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Block size / dynamic shared memory is not bounded by device limits in the size path.

Unlike filter_join_indices (Lines 101-107), this size path fixes the block size at DEFAULT_JOIN_BLOCK_SIZE and computes shmem_per_block without clamping to cudaDevAttrMaxSharedMemoryPerBlock. For heavy predicates with large shmem_per_thread, the launch can request more dynamic shared memory than the device allows, causing invalid-launch failures.

Suggested fix mirroring `filter_join_indices`
-  detail::grid_1d const config(left_indices.size(), DEFAULT_JOIN_BLOCK_SIZE);
-  auto const shmem_per_block = parser.shmem_per_thread * DEFAULT_JOIN_BLOCK_SIZE;
+  int device_id;
+  CUDF_CUDA_TRY(cudaGetDevice(&device_id));
+  int shmem_limit_per_block;
+  CUDF_CUDA_TRY(cudaDeviceGetAttribute(
+    &shmem_limit_per_block, cudaDevAttrMaxSharedMemoryPerBlock, device_id));
+  auto const block_size =
+    parser.shmem_per_thread != 0
+      ? std::min(DEFAULT_JOIN_BLOCK_SIZE, shmem_limit_per_block / parser.shmem_per_thread)
+      : DEFAULT_JOIN_BLOCK_SIZE;
+  detail::grid_1d const config(left_indices.size(), block_size);
+  auto const shmem_per_block = parser.shmem_per_thread * config.num_threads_per_block;

As per coding guidelines, "Verify kernel launches have valid grid/block dimensions (non-zero blocks/threads)."

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@cpp/src/join/filter_join_indices/filter_join_indices.cu` around lines 393 -
394, The size-path launch uses a fixed DEFAULT_JOIN_BLOCK_SIZE and computes
shmem_per_block from parser.shmem_per_thread without clamping, so update the
logic to mirror the other path: query cudaDevAttrMaxSharedMemoryPerBlock,
compute max_threads_allowed = max_shared_mem / max(1, parser.shmem_per_thread),
clamp block size to min(DEFAULT_JOIN_BLOCK_SIZE, max_threads_allowed) and
recompute shmem_per_block = parser.shmem_per_thread * block_size (ensuring
shmem_per_block <= max_shared_mem), and finally validate the block size and
shmem_per_block are non-zero/within device limits before launching; reference
the variables/configs used here: DEFAULT_JOIN_BLOCK_SIZE,
parser.shmem_per_thread, config, and shmem_per_block.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Duplicate comments:
In `@cpp/src/join/filter_join_indices/filter_join_indices.cu`:
- Around line 393-394: The size-path launch uses a fixed DEFAULT_JOIN_BLOCK_SIZE
and computes shmem_per_block from parser.shmem_per_thread without clamping, so
update the logic to mirror the other path: query
cudaDevAttrMaxSharedMemoryPerBlock, compute max_threads_allowed = max_shared_mem
/ max(1, parser.shmem_per_thread), clamp block size to
min(DEFAULT_JOIN_BLOCK_SIZE, max_threads_allowed) and recompute shmem_per_block
= parser.shmem_per_thread * block_size (ensuring shmem_per_block <=
max_shared_mem), and finally validate the block size and shmem_per_block are
non-zero/within device limits before launching; reference the variables/configs
used here: DEFAULT_JOIN_BLOCK_SIZE, parser.shmem_per_thread, config, and
shmem_per_block.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 3e8a0552-7ee9-4fba-bb11-758c064e8f80

📥 Commits

Reviewing files that changed from the base of the PR and between 046f944 and c0759ab.

📒 Files selected for processing (5)
  • cpp/CMakeLists.txt
  • cpp/include/cudf/join/join.hpp
  • cpp/src/join/filter_join_indices/filter_join_indices.cu
  • cpp/src/join/filter_join_indices/filter_join_indices_size_kernel.cuh
  • cpp/tests/join/mixed_join_tests.cu
💤 Files with no reviewable changes (1)
  • cpp/CMakeLists.txt
🚧 Files skipped from review as they are similar to previous changes (2)
  • cpp/tests/join/mixed_join_tests.cu
  • cpp/src/join/filter_join_indices/filter_join_indices_size_kernel.cuh

@PointKernel PointKernel changed the title Add filter_join_indices_size Add filter_join_indices_output_size Jun 2, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
cpp/src/join/filter_join_indices/filter_join_indices_output_size_kernel.cuh (1)

40-48: ⚠️ Potential issue | 🟠 Major | 🏗️ Heavy lift

Make LEFT_JOIN left_passing_marks marking race-free.

In cpp/src/join/filter_join_indices/filter_join_indices_output_size_kernel.cuh, the LEFT_JOIN path does left_passing_marks[left_row_index] = true; for every predicate-passing pair; multiple threads can target the same left_row_index, so this plain non-atomic store to a shared bool element is a data race. The host then derives the output size by count_if over left_passing_marks in cpp/src/join/filter_join_indices/filter_join_indices.cu (LEFT_JOIN case), so this must be race-free. Use an atomic/set-once representation for the marks (e.g., switch to uint8_t/unsigned int and set via atomicOr(..., 1) / cuda::atomic_ref), rather than writing bool directly.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@cpp/src/join/filter_join_indices/filter_join_indices_output_size_kernel.cuh`
around lines 40 - 48, The LEFT_JOIN path in
filter_join_indices_output_size_kernel currently does non-atomic writes to
left_passing_marks (left_passing_marks[left_row_index] = true), causing data
races; change the mark representation to an atomic-safe integer type (e.g.,
uint8_t or unsigned int) and set it atomically in the kernel (use atomicOr or
cuda::atomic_ref to set bit/value to 1) instead of writing a bool; update all
callers/allocations that provide left_passing_marks to allocate and
zero-initialize the new integer type and update the host-side count logic (the
count_if in filter_join_indices.cu) to treat non-zero as passed; keep the symbol
names filter_join_indices_output_size_kernel and left_passing_marks so the
changes are localized.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@cpp/src/join/filter_join_indices/filter_join_indices_output_size_kernel.cuh`:
- Around line 40-48: The LEFT_JOIN path in
filter_join_indices_output_size_kernel currently does non-atomic writes to
left_passing_marks (left_passing_marks[left_row_index] = true), causing data
races; change the mark representation to an atomic-safe integer type (e.g.,
uint8_t or unsigned int) and set it atomically in the kernel (use atomicOr or
cuda::atomic_ref to set bit/value to 1) instead of writing a bool; update all
callers/allocations that provide left_passing_marks to allocate and
zero-initialize the new integer type and update the host-side count logic (the
count_if in filter_join_indices.cu) to treat non-zero as passed; keep the symbol
names filter_join_indices_output_size_kernel and left_passing_marks so the
changes are localized.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 20f32451-0f39-4b30-808a-d09c42e23d7f

📥 Commits

Reviewing files that changed from the base of the PR and between c0759ab and 7e93579.

📒 Files selected for processing (11)
  • cpp/CMakeLists.txt
  • cpp/include/cudf/join/join.hpp
  • cpp/src/join/filter_join_indices/filter_join_indices.cu
  • cpp/src/join/filter_join_indices/filter_join_indices_kernel.cuh
  • cpp/src/join/filter_join_indices/filter_join_indices_output_size_kernel.cuh
  • cpp/src/join/filter_join_indices/filter_join_indices_output_size_kernel.hpp
  • cpp/src/join/filter_join_indices/filter_join_indices_output_size_kernel_complex.cu
  • cpp/src/join/filter_join_indices/filter_join_indices_output_size_kernel_null_complex.cu
  • cpp/src/join/filter_join_indices/filter_join_indices_output_size_kernel_null_primitive.cu
  • cpp/src/join/filter_join_indices/filter_join_indices_output_size_kernel_primitive.cu
  • cpp/tests/join/mixed_join_tests.cu
✅ Files skipped from review due to trivial changes (1)
  • cpp/src/join/filter_join_indices/filter_join_indices_output_size_kernel_primitive.cu
🚧 Files skipped from review as they are similar to previous changes (3)
  • cpp/src/join/filter_join_indices/filter_join_indices_kernel.cuh
  • cpp/tests/join/mixed_join_tests.cu
  • cpp/CMakeLists.txt

@bdice bdice left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

All seems fine to me.

I had one small thought for future work: we could process fewer bytes and potentially use smaller/faster kernels if we can pre-apply filters that only use one table (left/right).

Comment thread cpp/include/cudf/join/join.hpp

@vuule vuule left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

few non-blocking comments

Comment thread cpp/src/join/filter_join_indices/filter_join_indices.cu Outdated
Comment thread cpp/src/join/filter_join_indices/filter_join_indices.cu Outdated
Comment thread cpp/src/join/filter_join_indices/filter_join_indices.cu Outdated
Comment thread cpp/src/join/filter_join_indices/filter_join_indices.cu Outdated

@mhaseeb123 mhaseeb123 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Nothing further than @vuule's comments

@PointKernel

Copy link
Copy Markdown
Member Author

/merge

@rapids-bot
rapids-bot Bot merged commit 0e1a687 into main Jun 9, 2026
376 of 380 checks passed
@PointKernel
PointKernel deleted the add-filter-join-indices-size branch June 9, 2026 22:24
@coderabbitai coderabbitai Bot mentioned this pull request Jul 22, 2026
3 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CMake CMake build issue feature request New feature or request libcudf Affects libcudf (C++/CUDA) code. non-breaking Non-breaking change

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants