From 6f6d8ef8cb6b3db60f993d86ee246a6deeed0f83 Mon Sep 17 00:00:00 2001 From: Bradley Dice Date: Mon, 12 Feb 2024 20:18:23 -0800 Subject: [PATCH 1/5] Defer cuFile feature check until calling find_package for libkvikio. --- cpp/CMakeLists.txt | 53 ++++++++++++++++++++++++++++++++++++---------- 1 file changed, 42 insertions(+), 11 deletions(-) diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index 42a05508c6..a0b8328b84 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -1,5 +1,5 @@ # ============================================================================= -# Copyright (c) 2021-2023, NVIDIA CORPORATION. +# Copyright (c) 2021-2024, NVIDIA CORPORATION. # # Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except # in compliance with the License. You may obtain a copy of the License at @@ -91,16 +91,6 @@ target_include_directories( target_link_libraries(kvikio INTERFACE Threads::Threads) target_link_libraries(kvikio INTERFACE CUDA::toolkit) -if(cuFile_FOUND) - target_link_libraries(kvikio INTERFACE cufile::cuFile_interface) - target_compile_definitions(kvikio INTERFACE KVIKIO_CUFILE_FOUND) - if(cuFile_BATCH_API_FOUND) - target_compile_definitions(kvikio INTERFACE KVIKIO_CUFILE_BATCH_API_FOUND) - endif() - if(cuFile_STREAM_API_FOUND) - target_compile_definitions(kvikio INTERFACE KVIKIO_CUFILE_STREAM_API_FOUND) - endif() -endif() target_link_libraries(kvikio INTERFACE ${CMAKE_DL_LIBS}) target_compile_features(kvikio INTERFACE cxx_std_17) @@ -145,6 +135,46 @@ rapids_export( DOCUMENTATION doc_string ) +set(build_code_string + [=[ + +# Find cuFile and determine which features are supported +find_package(cuFile) +if(NOT cuFile_FOUND) + message(WARNING "KvikIO: Building KvikIO without cuFile") +else() + file(READ "${cuFile_INCLUDE_DIRS}/cufile.h" CUFILE_H_STR) + string(FIND "${CUFILE_H_STR}" "cuFileBatchIOSetUp" cuFileBatchIOSetUp_location) + if(cuFileBatchIOSetUp_location EQUAL "-1") + set(cuFile_BATCH_API_FOUND FALSE) + else() + set(cuFile_BATCH_API_FOUND TRUE) + endif() + message(STATUS "KvikIO: Found cuFile's Batch API: ${cuFile_BATCH_API_FOUND}") + string(FIND "${CUFILE_H_STR}" "cuFileReadAsync" cuFileReadAsync_location) + if(cuFileReadAsync_location EQUAL "-1") + set(cuFile_STREAM_API_FOUND FALSE) + else() + set(cuFile_STREAM_API_FOUND TRUE) + endif() + message(STATUS "KvikIO: Found cuFile's Stream API: ${cuFile_STREAM_API_FOUND}") +endif() + +# Enable supported cuFile features in KvikIO +if(cuFile_FOUND) + target_link_libraries(kvikio::kvikio INTERFACE cufile::cuFile_interface) + target_compile_definitions(kvikio::kvikio INTERFACE KVIKIO_CUFILE_FOUND) + if(cuFile_BATCH_API_FOUND) + target_compile_definitions(kvikio::kvikio INTERFACE KVIKIO_CUFILE_BATCH_API_FOUND) + endif() + if(cuFile_STREAM_API_FOUND) + target_compile_definitions(kvikio::kvikio INTERFACE KVIKIO_CUFILE_STREAM_API_FOUND) + endif() +endif() + +]=] +) + # build export targets rapids_export( BUILD kvikio @@ -152,4 +182,5 @@ rapids_export( GLOBAL_TARGETS kvikio NAMESPACE kvikio:: DOCUMENTATION doc_string + FINAL_CODE_BLOCK build_code_string ) From 17c3af0c56e47d959fd6caf4d8518ab648814ccb Mon Sep 17 00:00:00 2001 From: Bradley Dice Date: Mon, 12 Feb 2024 20:29:18 -0800 Subject: [PATCH 2/5] Enable batch/stream support in examples. --- cpp/examples/CMakeLists.txt | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/cpp/examples/CMakeLists.txt b/cpp/examples/CMakeLists.txt index bb653ed8fb..42b646022c 100644 --- a/cpp/examples/CMakeLists.txt +++ b/cpp/examples/CMakeLists.txt @@ -1,5 +1,5 @@ # ============================================================================= -# Copyright (c) 2021-2023, NVIDIA CORPORATION. +# Copyright (c) 2021-2024, NVIDIA CORPORATION. # # Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except # in compliance with the License. You may obtain a copy of the License at @@ -20,6 +20,18 @@ set_target_properties(BASIC_IO_TEST PROPERTIES INSTALL_RPATH "\$ORIGIN/../../lib target_include_directories(BASIC_IO_TEST PRIVATE ../include ${cuFile_INCLUDE_DIRS}) target_link_libraries(BASIC_IO_TEST PRIVATE kvikio CUDA::cudart) +# Enable supported cuFile features in KvikIO examples +if(cuFile_FOUND) + target_link_libraries(BASIC_IO_TEST PRIVATE cufile::cuFile_interface) + target_compile_definitions(BASIC_IO_TEST PRIVATE KVIKIO_CUFILE_FOUND) + if(cuFile_BATCH_API_FOUND) + target_compile_definitions(BASIC_IO_TEST PRIVATE KVIKIO_CUFILE_BATCH_API_FOUND) + endif() + if(cuFile_STREAM_API_FOUND) + target_compile_definitions(BASIC_IO_TEST PRIVATE KVIKIO_CUFILE_STREAM_API_FOUND) + endif() +endif() + if(CMAKE_COMPILER_IS_GNUCXX) set(KVIKIO_CXX_FLAGS "-Wall;-Werror;-Wno-unknown-pragmas") target_compile_options(BASIC_IO_TEST PRIVATE "$<$:${KVIKIO_CXX_FLAGS}>") From 4cb4cfbdd32d5661ffc668390f7e01101a049de4 Mon Sep 17 00:00:00 2001 From: Bradley Dice Date: Tue, 13 Feb 2024 11:42:00 -0800 Subject: [PATCH 3/5] Use final_code_string in both BUILD and INSTALL, add conditional guard at DIRECTORY scope. --- cpp/CMakeLists.txt | 84 ++++++++++++++++++++++++---------------------- 1 file changed, 44 insertions(+), 40 deletions(-) diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index a0b8328b84..9fdcbfcd23 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -127,54 +127,58 @@ Provide targets for KvikIO: C++ bindings for cuFile. ]=] ) -rapids_export( - INSTALL kvikio - EXPORT_SET kvikio-exports - GLOBAL_TARGETS kvikio - NAMESPACE kvikio:: - DOCUMENTATION doc_string -) - -set(build_code_string +set(final_code_string [=[ - -# Find cuFile and determine which features are supported -find_package(cuFile) -if(NOT cuFile_FOUND) - message(WARNING "KvikIO: Building KvikIO without cuFile") -else() - file(READ "${cuFile_INCLUDE_DIRS}/cufile.h" CUFILE_H_STR) - string(FIND "${CUFILE_H_STR}" "cuFileBatchIOSetUp" cuFileBatchIOSetUp_location) - if(cuFileBatchIOSetUp_location EQUAL "-1") - set(cuFile_BATCH_API_FOUND FALSE) +get_property(already_set_kvikio DIRECTORY PROPERTY kvikio_already_set_defines SET) +if(NOT already_set_kvikio) + set_property(DIRECTORY PROPERTY kvikio_already_set_defines "ON") + + # Find cuFile and determine which features are supported + find_package(cuFile) + if(NOT cuFile_FOUND) + message(WARNING "KvikIO: Building KvikIO without cuFile") else() - set(cuFile_BATCH_API_FOUND TRUE) + file(READ "${cuFile_INCLUDE_DIRS}/cufile.h" CUFILE_H_STR) + string(FIND "${CUFILE_H_STR}" "cuFileBatchIOSetUp" cuFileBatchIOSetUp_location) + if(cuFileBatchIOSetUp_location EQUAL "-1") + set(cuFile_BATCH_API_FOUND FALSE) + else() + set(cuFile_BATCH_API_FOUND TRUE) + endif() + message(STATUS "KvikIO: Found cuFile's Batch API: ${cuFile_BATCH_API_FOUND}") + string(FIND "${CUFILE_H_STR}" "cuFileReadAsync" cuFileReadAsync_location) + if(cuFileReadAsync_location EQUAL "-1") + set(cuFile_STREAM_API_FOUND FALSE) + else() + set(cuFile_STREAM_API_FOUND TRUE) + endif() + message(STATUS "KvikIO: Found cuFile's Stream API: ${cuFile_STREAM_API_FOUND}") endif() - message(STATUS "KvikIO: Found cuFile's Batch API: ${cuFile_BATCH_API_FOUND}") - string(FIND "${CUFILE_H_STR}" "cuFileReadAsync" cuFileReadAsync_location) - if(cuFileReadAsync_location EQUAL "-1") - set(cuFile_STREAM_API_FOUND FALSE) - else() - set(cuFile_STREAM_API_FOUND TRUE) - endif() - message(STATUS "KvikIO: Found cuFile's Stream API: ${cuFile_STREAM_API_FOUND}") -endif() -# Enable supported cuFile features in KvikIO -if(cuFile_FOUND) - target_link_libraries(kvikio::kvikio INTERFACE cufile::cuFile_interface) - target_compile_definitions(kvikio::kvikio INTERFACE KVIKIO_CUFILE_FOUND) - if(cuFile_BATCH_API_FOUND) - target_compile_definitions(kvikio::kvikio INTERFACE KVIKIO_CUFILE_BATCH_API_FOUND) - endif() - if(cuFile_STREAM_API_FOUND) - target_compile_definitions(kvikio::kvikio INTERFACE KVIKIO_CUFILE_STREAM_API_FOUND) + # Enable supported cuFile features in KvikIO + if(cuFile_FOUND) + target_link_libraries(kvikio::kvikio INTERFACE cufile::cuFile_interface) + target_compile_definitions(kvikio::kvikio INTERFACE KVIKIO_CUFILE_FOUND) + if(cuFile_BATCH_API_FOUND) + target_compile_definitions(kvikio::kvikio INTERFACE KVIKIO_CUFILE_BATCH_API_FOUND) + endif() + if(cuFile_STREAM_API_FOUND) + target_compile_definitions(kvikio::kvikio INTERFACE KVIKIO_CUFILE_STREAM_API_FOUND) + endif() endif() endif() - ]=] ) +rapids_export( + INSTALL kvikio + EXPORT_SET kvikio-exports + GLOBAL_TARGETS kvikio + NAMESPACE kvikio:: + DOCUMENTATION doc_string + FINAL_CODE_BLOCK final_code_string +) + # build export targets rapids_export( BUILD kvikio @@ -182,5 +186,5 @@ rapids_export( GLOBAL_TARGETS kvikio NAMESPACE kvikio:: DOCUMENTATION doc_string - FINAL_CODE_BLOCK build_code_string + FINAL_CODE_BLOCK final_code_string ) From 221c2a632770d9a2fd799b95ab10ca6ec00a006e Mon Sep 17 00:00:00 2001 From: Bradley Dice Date: Tue, 13 Feb 2024 15:18:00 -0600 Subject: [PATCH 4/5] find_package(cuFile QUIET) Co-authored-by: Vyas Ramasubramani --- cpp/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index 9fdcbfcd23..7dbe177535 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -134,7 +134,7 @@ if(NOT already_set_kvikio) set_property(DIRECTORY PROPERTY kvikio_already_set_defines "ON") # Find cuFile and determine which features are supported - find_package(cuFile) + find_package(cuFile QUIET) if(NOT cuFile_FOUND) message(WARNING "KvikIO: Building KvikIO without cuFile") else() From 402bb63a7e22500b427b72908d6700e0295fd34a Mon Sep 17 00:00:00 2001 From: Bradley Dice Date: Tue, 13 Feb 2024 14:51:36 -0800 Subject: [PATCH 5/5] Update messages. --- cpp/CMakeLists.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index 7dbe177535..94b06b8021 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -70,14 +70,14 @@ else() else() set(cuFile_BATCH_API_FOUND TRUE) endif() - message(STATUS "Found cuFile's Batch API: ${cuFile_BATCH_API_FOUND}") + message(STATUS "Found cuFile Batch API: ${cuFile_BATCH_API_FOUND}") string(FIND "${CUFILE_H_STR}" "cuFileReadAsync" cuFileReadAsync_location) if(cuFileReadAsync_location EQUAL "-1") set(cuFile_STREAM_API_FOUND FALSE) else() set(cuFile_STREAM_API_FOUND TRUE) endif() - message(STATUS "Found cuFile's Stream API: ${cuFile_STREAM_API_FOUND}") + message(STATUS "Found cuFile Stream API: ${cuFile_STREAM_API_FOUND}") endif() # library targets @@ -136,7 +136,7 @@ if(NOT already_set_kvikio) # Find cuFile and determine which features are supported find_package(cuFile QUIET) if(NOT cuFile_FOUND) - message(WARNING "KvikIO: Building KvikIO without cuFile") + message(WARNING "KvikIO: cuFile not found") else() file(READ "${cuFile_INCLUDE_DIRS}/cufile.h" CUFILE_H_STR) string(FIND "${CUFILE_H_STR}" "cuFileBatchIOSetUp" cuFileBatchIOSetUp_location) @@ -145,14 +145,14 @@ if(NOT already_set_kvikio) else() set(cuFile_BATCH_API_FOUND TRUE) endif() - message(STATUS "KvikIO: Found cuFile's Batch API: ${cuFile_BATCH_API_FOUND}") + message(STATUS "KvikIO: Found cuFile Batch API: ${cuFile_BATCH_API_FOUND}") string(FIND "${CUFILE_H_STR}" "cuFileReadAsync" cuFileReadAsync_location) if(cuFileReadAsync_location EQUAL "-1") set(cuFile_STREAM_API_FOUND FALSE) else() set(cuFile_STREAM_API_FOUND TRUE) endif() - message(STATUS "KvikIO: Found cuFile's Stream API: ${cuFile_STREAM_API_FOUND}") + message(STATUS "KvikIO: Found cuFile Stream API: ${cuFile_STREAM_API_FOUND}") endif() # Enable supported cuFile features in KvikIO