diff --git a/.github/workflows/linux_debug_fetch_hwloc.yml b/.github/workflows/linux_debug_fetch_hwloc.yml new file mode 100644 index 000000000000..aeeaf7df1367 --- /dev/null +++ b/.github/workflows/linux_debug_fetch_hwloc.yml @@ -0,0 +1,50 @@ +# Copyright (c) 2024 Vedant Nimje +# +# SPDX-License-Identifier: BSL-1.0 +# Distributed under the Boost Software License, Version 1.0. (See accompanying +# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +name: Linux CI (Debug) with HWLoc fetch + +on: [pull_request] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + + - name: Install Boost + run: sudo apt install libboost-all-dev ninja-build + + - name: Configure + shell: bash + run: | + cmake \ + . \ + -Bbuild \ + -GNinja \ + -DCMAKE_BUILD_TYPE=Debug \ + -DHPX_WITH_MALLOC=system \ + -DHPX_WITH_FETCH_ASIO=ON \ + -DHPX_WITH_FETCH_HWLOC=ON \ + -DHPX_WITH_EXAMPLES=ON \ + -DHPX_WITH_TESTS=ON \ + -DHPX_WITH_TESTS_MAX_THREADS_PER_LOCALITY=2 \ + -DHPX_WITH_CHECK_MODULE_DEPENDENCIES=On + + - name: Build + shell: bash + run: | + cmake --build build --target all + cmake --build build --target examples + + - name: Test + shell: bash + run: | + cd build + ctest \ + --output-on-failure \ + --tests-regex tests.examples \ + --exclude-regex tests.examples.transpose.transpose_block_numa diff --git a/.github/workflows/macos_debug_fetch_hwloc.yml b/.github/workflows/macos_debug_fetch_hwloc.yml new file mode 100644 index 000000000000..e8ad7ab94dca --- /dev/null +++ b/.github/workflows/macos_debug_fetch_hwloc.yml @@ -0,0 +1,81 @@ +# Copyright (c) 2024 Vedant Nimje +# +# SPDX-License-Identifier: BSL-1.0 +# Distributed under the Boost Software License, Version 1.0. (See accompanying +# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +name: macOS CI (Debug) with HWLoc fetch + +on: [pull_request] + +jobs: + build: + runs-on: macos-latest + + steps: + - uses: actions/checkout@v4 + - name: Install dependencies + run: | + # Workaround for https://github.com/actions/virtual-environments/issues/2322 + rm -rf /usr/local/bin/2to3* + rm -rf /usr/local/bin/idle3* + rm -rf /usr/local/bin/pydoc3* + rm -rf /usr/local/bin/python3* + brew upgrade + brew update && \ + brew install --overwrite python-tk && \ + brew install --overwrite boost gperftools ninja && \ + brew upgrade cmake + - name: Configure + shell: bash + run: | + cmake \ + -H. \ + -Bbuild \ + -GNinja \ + -DCMAKE_BUILD_TYPE=Debug \ + -DHPX_WITH_FETCH_ASIO=ON \ + -DHPX_WITH_FETCH_HWLOC=ON \ + -DHPX_WITH_EXAMPLES=ON \ + -DHPX_WITH_TESTS=ON \ + -DHPX_WITH_TESTS_MAX_THREADS_PER_LOCALITY=3 \ + -DHPX_WITH_CHECK_MODULE_DEPENDENCIES=ON + - name: Build + shell: bash + run: | + cmake --build build --target all + cmake --build build --target tests + - name: Test + shell: bash + run: | + cd build + ctest --output-on-failure \ + --exclude-regex \ + "tests.examples.quickstart.1d_wave_equation|\ + tests.examples.transpose.transpose_block_numa|\ + tests.performance.local.wait_all_timings|\ + tests.regressions.components.distributed.tcp.bulk_new_3054|\ + tests.regressions.dynamic_counters_loaded_1508|\ + tests.regressions.lcos.wait_all_hang_1946|\ + tests.regressions.modules.async_combinators.wait_all_hang_1946|\ + tests.regressions.modules.collectives.distributed.tcp.broadcast_apply|\ + tests.regressions.modules.collectives.distributed.tcp.broadcast_unwrap_future_2885|\ + tests.regressions.modules.collectives.distributed.tcp.remote_latch|\ + tests.regressions.modules.compute_local.parallel_fill_4132|\ + tests.regressions.util.distributed.tcp.zero_copy_parcels_1001_no_zero_copy_optimization|\ + tests.regressions.modules.performance_counters.dynamic_counters_loaded_1508|\ + tests.regressions.modules.performance_counters.statistics_2666|\ + tests.unit.modules.runtime_components.distributed.tcp.migrate_component|\ + tests.unit.modules.runtime_components.distributed.tcp.migrate_polymorphic_component|\ + tests.unit.modules.algorithms.default_construct|\ + tests.unit.modules.algorithms.destroy|\ + tests.unit.modules.algorithms.foreach_executors|\ + tests.unit.modules.algorithms.max_element|\ + tests.unit.modules.algorithms.replace_copy_if|\ + tests.unit.modules.compute_local.numa_allocator|\ + tests.unit.modules.execution.standalone_thread_pool_executor|\ + tests.unit.modules.resource_partitioner.used_pus|\ + tests.unit.modules.segmented_algorithms.distributed.tcp.partitioned_vector|\ + tests.unit.threads.distributed.tcp.thread_stacksize|\ + tests.unit.topology.numa_allocator|\ + tests.unit.modules.runtime_components.distributed.tcp.migrate_polymorphic_component" diff --git a/.github/workflows/windows_debug_vs2022_fetch_hwloc.yml b/.github/workflows/windows_debug_vs2022_fetch_hwloc.yml new file mode 100644 index 000000000000..7474ee828230 --- /dev/null +++ b/.github/workflows/windows_debug_vs2022_fetch_hwloc.yml @@ -0,0 +1,61 @@ +# Copyright (c) 2024 Vedant Nimje +# +# SPDX-License-Identifier: BSL-1.0 +# Distributed under the Boost Software License, Version 1.0. (See accompanying +# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +name: Windows CI (Debug, VS2022 toolset) with HWLoc fetch + +on: [pull_request] + +jobs: + build: + runs-on: windows-latest + + steps: + - uses: actions/checkout@v4 + - uses: jwlawson/actions-setup-cmake@v1.14 + with: + cmake-version: '3.22.x' + - name: Install dependencies + run: | + md C:\projects + $client = new-object System.Net.WebClient + $client.DownloadFile("https://rostam.cct.lsu.edu/download/builder/vcpkg-export-hpx-dependencies-2022.7z","C:\projects\vcpkg-export-hpx-dependencies.7z") + 7z x C:\projects\vcpkg-export-hpx-dependencies.7z -y -oC:\projects\vcpkg + - name: Configure + shell: bash + run: | + cmake . -Bbuild -G'Visual Studio 17 2022' \ + -DCMAKE_BUILD_TYPE=Debug \ + -DCMAKE_TOOLCHAIN_FILE='C:/projects/vcpkg/scripts/buildsystems/vcpkg.cmake' \ + -DHPX_WITH_FETCH_ASIO=ON \ + -DHPX_WITH_FETCH_HWLOC=ON \ + -DHPX_WITH_EXAMPLES=ON \ + -DHPX_WITH_TESTS=ON \ + -DHPX_WITH_TESTS_UNIT=ON \ + -DHPX_WITH_DEPRECATION_WARNINGS=OFF \ + -DHPX_WITH_TESTS_MAX_THREADS_PER_LOCALITY=2 \ + -DHPX_COROUTINES_WITH_SWAP_CONTEXT_EMULATION=ON \ + -DHPX_WITH_CHECK_MODULE_DEPENDENCIES=On + - name: Build + shell: bash + run: | + cmake --build build --config Debug \ + --target ALL_BUILD \ + -- -maxcpucount:2 -verbosity:minimal -nologo + - name: Install + shell: bash + run: | + cmake --install build --config Debug + - name: Test + run: | + Set-Alias -Name grep -Value 'C:\Program Files\Git\usr\bin\grep.exe' + Set-Alias -Name sed -Value 'C:\Program Files\Git\usr\bin\sed.exe' + cd build + ctest ` + --output-on-failure ` + --build-config Debug ` + --tests-regex tests.examples ` + --exclude-regex ` + $(grep -v -e ^# -e ^$ D:/a/hpx/hpx/.github/workflows/tests.examples.targets | sed ':b;N;$!bb;s/\n/|/g') diff --git a/CMakeLists.txt b/CMakeLists.txt index 70cb6299c33c..996c66ba25e3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -980,6 +980,16 @@ hpx_option( ADVANCED ) +# Option for automatically fetching Hwloc +hpx_option( + HPX_WITH_FETCH_HWLOC + BOOL + "Use FetchContent to fetch Hwloc. By default an installed Hwloc will be used. (default: OFF)" + OFF + CATEGORY "Build Targets" + ADVANCED +) + # cmake-format: off # LibCDS option # NOTE: The libcds option is disabled for the 1.5.0 release as it is not ready @@ -2322,6 +2332,18 @@ endif() if(HPX_WITH_EXAMPLES) add_hpx_pseudo_target(examples) + if(HPX_WITH_FETCH_HWLOC AND "${CMAKE_SYSTEM_NAME}" STREQUAL "Windows") + add_custom_target( + HwlocDLL ALL + COMMAND ${CMAKE_COMMAND} -E make_directory + "${CMAKE_BINARY_DIR}/$/bin/" + COMMAND + ${CMAKE_COMMAND} -E copy_if_different + "${HWLOC_ROOT}/bin/libhwloc-15.dll" + "${CMAKE_BINARY_DIR}/$/bin/" + ) + add_hpx_pseudo_dependencies(examples HwlocDLL) + endif() endif() # ############################################################################## diff --git a/cmake/HPX_SetupHwloc.cmake b/cmake/HPX_SetupHwloc.cmake index 12ce52247a36..7d79a3a65a13 100644 --- a/cmake/HPX_SetupHwloc.cmake +++ b/cmake/HPX_SetupHwloc.cmake @@ -13,9 +13,102 @@ # Distributed under the Boost Software License, Version 1.0. (See accompanying # file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -find_package(Hwloc) -if(NOT Hwloc_FOUND) - hpx_error( - "Hwloc could not be found, please specify Hwloc_ROOT to point to the correct location" +if(NOT HPX_WITH_FETCH_HWLOC) + find_package(Hwloc) + if(NOT Hwloc_FOUND) + hpx_error( + "Hwloc could not be found, please specify Hwloc_ROOT to point to the correct location" + ) + endif() +else() + set(HPX_WITH_HWLOC_VERSION "2.9") + set(HPX_WITH_HWLOC_RELEASE "2.9.3") + hpx_info( + "HPX_WITH_FETCH_HWLOC=${HPX_WITH_FETCH_HWLOC}, Hwloc v${HPX_WITH_HWLOC_RELEASE} will be fetched using CMake's FetchContent" ) + if(UNIX) + include(FetchContent) + fetchcontent_declare( + HWLoc + URL https://download.open-mpi.org/release/hwloc/v${HPX_WITH_HWLOC_VERSION}/hwloc-${HPX_WITH_HWLOC_RELEASE}.tar.gz + TLS_VERIFY true + ) + if(NOT HWLoc_POPULATED) + fetchcontent_populate(HWLoc) + execute_process( + COMMAND + sh -c + "cd ${CMAKE_BINARY_DIR}/_deps/hwloc-src && ./configure --prefix=${CMAKE_BINARY_DIR}/_deps/hwloc-installed && make -j && make install" + ) + endif() + set(HWLOC_ROOT "${CMAKE_BINARY_DIR}/_deps/hwloc-installed") + set(Hwloc_INCLUDE_DIR + ${HWLOC_ROOT}/include + CACHE INTERNAL "" + ) + if(APPLE) + set(Hwloc_LIBRARY + ${HWLOC_ROOT}/lib/libhwloc.dylib + CACHE INTERNAL "" + ) + else() + set(Hwloc_LIBRARY + ${HWLOC_ROOT}/lib/libhwloc.so + CACHE INTERNAL "" + ) + endif() + + elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows" AND CMAKE_SIZEOF_VOID_P + EQUAL 8 + ) + fetchcontent_declare( + HWLoc + URL https://download.open-mpi.org/release/hwloc/v${HPX_WITH_HWLOC_VERSION}/hwloc-win64-build-${HPX_WITH_HWLOC_RELEASE}.zip + TLS_VERIFY true + ) + if(NOT HWLoc_POPULATED) + fetchcontent_populate(HWLoc) + endif() + set(HWLOC_ROOT + "${CMAKE_BINARY_DIR}/_deps/hwloc-src" + CACHE INTERNAL "" + ) + include_directories(${HWLOC_ROOT}/include) + link_directories(${HWLOC_ROOT}/lib) + set(Hwloc_INCLUDE_DIR + ${HWLOC_ROOT}/include + CACHE INTERNAL "" + ) + set(Hwloc_LIBRARY + ${HWLOC_ROOT}/lib/libhwloc.dll.a + CACHE INTERNAL "" + ) + else() + fetchcontent_declare( + HWLoc + URL https://download.open-mpi.org/release/hwloc/v${HPX_WITH_HWLOC_VERSION}/hwloc-win32-build-${HPX_WITH_HWLOC_RELEASE}.zip + TLS_VERIFY true + ) + if(NOT HWLoc_POPULATED) + fetchcontent_populate(HWLoc) + endif() + set(HWLOC_ROOT + "${CMAKE_BINARY_DIR}/_deps/hwloc-src" + CACHE INTERNAL "" + ) + include_directories(${HWLOC_ROOT}/include) + link_directories(${HWLOC_ROOT}/lib) + set(Hwloc_INCLUDE_DIR + ${HWLOC_ROOT}/include + CACHE INTERNAL "" + ) + set(Hwloc_LIBRARY + ${HWLOC_ROOT}/lib/libhwloc.dll.a + CACHE INTERNAL "" + ) + endif() # End hwloc installation + + add_library(Hwloc::hwloc INTERFACE IMPORTED) + target_include_directories(Hwloc::hwloc INTERFACE ${Hwloc_INCLUDE_DIR}) + target_link_libraries(Hwloc::hwloc INTERFACE ${Hwloc_LIBRARY}) endif()