Skip to content

Commit 2b4e4d3

Browse files
authored
Patch cuDF Arrow device StringView import (#4)
Signed-off-by: Alexander Droste <alexander.droste@protonmail.com>
1 parent 01372ba commit 2b4e4d3

5 files changed

Lines changed: 79 additions & 3 deletions

File tree

.github/workflows/ci.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
name: Build and Release
1+
name: Build
22

33
on:
44
pull_request:
@@ -9,7 +9,7 @@ on:
99

1010
jobs:
1111
build:
12-
name: Build and Release
12+
name: Build
1313
runs-on: runs-on=${{ github.run_id }}/runner=gpu/tag=cudf-test-harness
1414
container:
1515
image: nvidia/cuda:13.1.0-devel-ubuntu24.04

CMakeLists.txt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ set(CMAKE_CUDA_FLAGS_DEBUG "-g -G -O0")
1717

1818
include(FetchContent)
1919
find_package(CUDAToolkit REQUIRED)
20+
find_package(Git REQUIRED)
2021

2122
if(CUDAToolkit_VERSION VERSION_LESS 13.0)
2223
message(FATAL_ERROR "cuDF 26.04.00 source builds require CUDA Toolkit 13.0 or newer")
@@ -37,6 +38,14 @@ FetchContent_Declare(
3738
GIT_REPOSITORY https://github.com/rapidsai/cudf.git
3839
GIT_TAG f9c3cf195768647ac39d98674a614ca414cd1baa
3940
SOURCE_SUBDIR cpp
41+
# Temporary until cuDF imports external Arrow C Device STRING_VIEW arrays without
42+
# assuming Nanoarrow-owned ArrowArray.private_data. Vortex exports producer-owned
43+
# private_data, which is valid Arrow C data.
44+
PATCH_COMMAND ${CMAKE_COMMAND}
45+
-DGIT_EXECUTABLE=${GIT_EXECUTABLE}
46+
-DSOURCE_DIR=<SOURCE_DIR>
47+
-DPATCH_FILE=${CMAKE_CURRENT_SOURCE_DIR}/patches/cudf-arrow-device-string-view-variadic-buffers.patch
48+
-P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/apply_patch_once.cmake
4049
)
4150
FetchContent_MakeAvailable(cudf)
4251

cmake/apply_patch_once.cmake

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
if(NOT DEFINED GIT_EXECUTABLE)
2+
message(FATAL_ERROR "GIT_EXECUTABLE is required")
3+
endif()
4+
if(NOT DEFINED SOURCE_DIR)
5+
message(FATAL_ERROR "SOURCE_DIR is required")
6+
endif()
7+
if(NOT DEFINED PATCH_FILE)
8+
message(FATAL_ERROR "PATCH_FILE is required")
9+
endif()
10+
11+
execute_process(
12+
COMMAND "${GIT_EXECUTABLE}" -C "${SOURCE_DIR}" apply --reverse --check "${PATCH_FILE}"
13+
RESULT_VARIABLE PATCH_ALREADY_APPLIED
14+
OUTPUT_QUIET
15+
ERROR_QUIET
16+
)
17+
18+
if(PATCH_ALREADY_APPLIED EQUAL 0)
19+
message(STATUS "Patch already applied: ${PATCH_FILE}")
20+
return()
21+
endif()
22+
23+
execute_process(
24+
COMMAND "${GIT_EXECUTABLE}" -C "${SOURCE_DIR}" apply --check "${PATCH_FILE}"
25+
RESULT_VARIABLE PATCH_CAN_APPLY
26+
OUTPUT_VARIABLE PATCH_CHECK_OUTPUT
27+
ERROR_VARIABLE PATCH_CHECK_ERROR
28+
)
29+
30+
if(NOT PATCH_CAN_APPLY EQUAL 0)
31+
message(FATAL_ERROR "Patch cannot be applied: ${PATCH_FILE}\n${PATCH_CHECK_OUTPUT}\n${PATCH_CHECK_ERROR}")
32+
endif()
33+
34+
execute_process(
35+
COMMAND "${GIT_EXECUTABLE}" -C "${SOURCE_DIR}" apply --whitespace=nowarn "${PATCH_FILE}"
36+
RESULT_VARIABLE PATCH_APPLY_RESULT
37+
OUTPUT_VARIABLE PATCH_APPLY_OUTPUT
38+
ERROR_VARIABLE PATCH_APPLY_ERROR
39+
)
40+
41+
if(NOT PATCH_APPLY_RESULT EQUAL 0)
42+
message(FATAL_ERROR "Patch failed: ${PATCH_FILE}\n${PATCH_APPLY_OUTPUT}\n${PATCH_APPLY_ERROR}")
43+
endif()
44+
45+
message(STATUS "Applied patch: ${PATCH_FILE}")
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
diff --git a/cpp/src/interop/from_arrow_device.cu b/cpp/src/interop/from_arrow_device.cu
2+
index c2f45af218..1c02352558 100644
3+
--- a/cpp/src/interop/from_arrow_device.cu
4+
+++ b/cpp/src/interop/from_arrow_device.cu
5+
@@ -176,9 +176,7 @@ dispatch_tuple_t dispatch_from_arrow_device::operator()<cudf::string_view>(
6+
auto const d_items = view.buffer_views[binary_view_vector_idx].data.as_binary_view;
7+
auto variadic_ptrs = std::vector<char const*>();
8+
for (auto i = 0L; i < view.n_variadic_buffers; ++i) {
9+
- auto variadic_buf =
10+
- ArrowArrayBuffer(const_cast<ArrowArray*>(input), i + NANOARROW_BINARY_VIEW_FIXED_BUFFERS);
11+
- variadic_ptrs.push_back(reinterpret_cast<char const*>(variadic_buf->data));
12+
+ variadic_ptrs.push_back(reinterpret_cast<char const*>(view.variadic_buffers[i]));
13+
}
14+
auto d_variadic_ptrs = cudf::detail::make_device_uvector_async(
15+
variadic_ptrs, stream, cudf::get_current_device_resource_ref());

src/main.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,14 @@ int run_check(const char *library_path) {
161161

162162
// convert to host array, call the verifier inside of the shared library.
163163
auto host_array = cudf::to_arrow_host(*table);
164-
if (validate_array(&schema, &host_array->array) != 0) {
164+
auto host_metadata = std::vector<cudf::column_metadata>{
165+
cudf::column_metadata{"prims"},
166+
cudf::column_metadata{"decimals"},
167+
cudf::column_metadata{"strings"},
168+
cudf::column_metadata{"dates"},
169+
};
170+
auto host_schema = cudf::to_arrow_schema(*table, host_metadata);
171+
if (validate_array(host_schema.get(), &host_array->array) != 0) {
165172
std::cerr << "\nValidation failed!\n";
166173
}
167174
} catch (const std::exception &e) {

0 commit comments

Comments
 (0)