diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..5dd5468 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,160 @@ +# Copyright (c) 2023 Aarya Chaumal +# +# 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: Test examples on Linux + +on: + push: + branches: + - main + pull_request: + +jobs: + build: + runs-on: ubuntu-latest + container: stellargroup/build_env:latest + + steps: + - uses: actions/checkout@v3 + - name: Install HPX + shell: bash + run: | + PREFIX="${CURRENT_DIR:=$(pwd)}" + + BUILD_TYPE=Release + HPX_DIR=${PREFIX}/hpx/ + mkdir -p ${PREFIX} + + git clone -b on_finalize https://github.com/light2802/hpx.git ${HPX_DIR} + + cd ${HPX_DIR} + cmake -DCMAKE_BUILD_TYPE=${BUILD_TYPE} \ + -DCMAKE_CXX_FLAGS="-std=c++17" \ + -DHPX_WITH_THREAD_IDLE_RATES=ON \ + -DHPX_WITH_MALLOC=tcmalloc \ + -DHPX_WITH_EXAMPLES=OFF \ + -DHPX_WITH_APEX=ON \ + -DHPX_WITH_FETCH_ASIO=ON \ + -DHPX_WITH_DYNAMIC_HPX_MAIN=OFF \ + -Wdev -S ${HPX_DIR} -B ${HPX_DIR}/cmake-build/${BUILD_TYPE} + + cmake --build ${HPX_DIR}/cmake-build/${BUILD_TYPE}/ --parallel + cmake --install ${HPX_DIR}/cmake-build/${BUILD_TYPE}/ --prefix ${HPX_DIR}/cmake-install/${BUILD_TYPE} + + - name: Install HPXC + shell: bash + run: | + PREFIX="${CURRENT_DIR:=$(pwd)}" + + BUILD_TYPE=Release + HPXC_DIR=${PREFIX}/hpxc + HPX_DIR=${PREFIX}/hpx/cmake-install/${BUILD_TYPE}/lib/cmake/HPX + + mkdir -p ${PREFIX} + + git clone -b hpxmp https://github.com/light2802/hpxc.git ${HPXC_DIR} + + cmake \ + -DCMAKE_BUILD_TYPE=${BUILD_TYPE} \ + -DHPX_DIR=${HPX_DIR} \ + -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \ + -DCMAKE_CXX_FLAGS="-std=c++17" \ + -Wdev -S ${HPXC_DIR} -B ${HPXC_DIR}/cmake-build/${BUILD_TYPE} \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON + + cmake --build ${HPXC_DIR}/cmake-build/${BUILD_TYPE}/ --parallel + cmake --install ${HPXC_DIR}/cmake-build/${BUILD_TYPE}/ --prefix ${HPXC_DIR}/cmake-install/${BUILD_TYPE} + + - name: Build hpxmp + shell: bash + run: | + PREFIX="${CURRENT_DIR:=$(pwd)}" + + BUILD_TYPE=Release + LLVM_DIR=${PREFIX}/llvm-project + LLVM_VERSION=16.0.6 + OMP_DIR=${LLVM_DIR}/openmp + HPX_DIR=${PREFIX}/hpx/cmake-install/${BUILD_TYPE}/lib/cmake/HPX + HPXC_DIR=${PREFIX}/hpxc + PROJECT=hpxmp + BUILD_DIR=${OMP_DIR}/cmake-build-${PROJECT}/${BUILD_TYPE}/ + + mkdir -p ${PREFIX} + + git clone --depth=1 -b hpxmp-v16 https://github.com/light2802/llvm-project.git ${LLVM_DIR} + + cmake \ + -DCMAKE_BUILD_TYPE=${BUILD_TYPE} \ + -DCMAKE_VERBOSE_MAKEFILE=ON \ + -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \ + -DCMAKE_CXX_FLAGS="-std=c++17" \ + -DHPX_DIR=${HPX_DIR} \ + -DWITH_HPXC=ON \ + -DHPXC_DIR=${HPXC_DIR} \ + -DOPENMP_ENABLE_LIBOMPTARGET=OFF \ + -DLIBOMP_OMPD_SUPPORT=OFF \ + -DLIBOMP_USE_STDCPPLIB:BOOL=TRUE \ + -DCMAKE_INSTALL_PREFIX=${OMP_DIR}/cmake-install-${PROJECT}/${BUILD_TYPE} \ + -Wdev -S ${OMP_DIR} -B ${BUILD_DIR} + + cmake --build ${BUILD_DIR} --parallel + cmake --install ${BUILD_DIR}/ --prefix ${OMP_DIR}/cmake-install-${PROJECT}/${BUILD_TYPE} + + # - name: Build OMP examples + # shell: bash + # run: | + # PREFIX="${CURRENT_DIR:=$(pwd)}" + + # EXAMPLE_PATH=${PREFIX}/running_examples + # BUILD_TYPE=Debug + # PROJECT=examples + + # mkdir -p ${PREFIX} + + # rm -rf ${EXAMPLE_PATH}/cmake-build-omp + + # cmake \ + # -DCMAKE_BUILD_TYPE=${BUILD_TYPE} \ + # -DCMAKE_VERBOSE_MAKEFILE=ON \ + # -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \ + # -DCMAKE_CXX_FLAGS="-std=c++17 -fopenmp" \ + # -DCMAKE_CXX_COMPILER=g++ \ + # -DCMAKE_C_COMPILER=gcc \ + # -DHPX_DIR=${HPX_DIR} \ + # -DOMP_LIB_PATH=${PREFIX}/llvm-project/openmp/cmake-install-omp/${BUILD_TYPE}/lib/libomp.so \ + # -Wdev -S ${EXAMPLE_PATH} -B ${EXAMPLE_PATH}/cmake-build-omp/${BUILD_TYPE} + + # cmake --build ${EXAMPLE_PATH}/cmake-build-omp/${BUILD_TYPE}/ --parallel + # cmake --install ${EXAMPLE_PATH}/cmake-build-omp/${BUILD_TYPE}/ --prefix ${EXAMPLE_PATH}/cmake-install-omp/${BUILD_TYPE} + + - name: Build HPXMP examples + shell: bash + env: + CC: gcc + CXX: g++ + run: | + PREFIX="${CURRENT_DIR:=$(pwd)}" + + EXAMPLE_PATH=${PREFIX}/running_examples + BUILD_TYPE=Release + HPX_DIR=${PREFIX}/hpx/cmake-install/${BUILD_TYPE}/lib/cmake/HPX + + mkdir -p ${PREFIX} + + rm -rf ${EXAMPLE_PATH}/cmake-build-hpxmp + + cmake \ + -DCMAKE_BUILD_TYPE=${BUILD_TYPE} \ + -DCMAKE_VERBOSE_MAKEFILE=ON \ + -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \ + -DCMAKE_CXX_FLAGS="-std=c++17 -fopenmp" \ + -DHPX_DIR=${HPX_DIR} \ + -DWITH_HPXC=ON \ + -DOMP_LIB_PATH=${PREFIX}/llvm-project/openmp/cmake-install-hpxmp/${BUILD_TYPE}/lib/libomp.so \ + -Wdev -S ${EXAMPLE_PATH} -B ${EXAMPLE_PATH}/cmake-build-hpxmp/${BUILD_TYPE} + + cmake --build ${EXAMPLE_PATH}/cmake-build-hpxmp/${BUILD_TYPE}/ --parallel + cmake --install ${EXAMPLE_PATH}/cmake-build-hpxmp/${BUILD_TYPE}/ --prefix ${EXAMPLE_PATH}/cmake-install-hpxmp/${BUILD_TYPE} diff --git a/.github/workflows/test_windows.yml b/.github/workflows/test_windows.yml new file mode 100644 index 0000000..ce95463 --- /dev/null +++ b/.github/workflows/test_windows.yml @@ -0,0 +1,165 @@ +# Copyright c 2023 Aarya Chaumal +# +# 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: Test examples on Windows + +on: + push: + branches: + - main + pull_request: + +jobs: + build: + runs-on: windows-latest + + steps: + - uses: actions/checkout@v3 + - uses: jwlawson/actions-setup-cmake@v1.14 + with: + cmake-version: "3.22.x" + # - name: Install deps + # shell: bash + # run: | + # perl -MCPAN -e "install Pod::Usage" + + - 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 + perl -MCPAN -e "install Pod::Usage" + + - name: Install HPX + shell: bash + run: | + PREFIX="${CURRENT_DIR:=$(pwd)}" + + BUILD_TYPE=Release + HPX_DIR=${PREFIX}/hpx/ + rm -rf ${HPX_DIR} + #mkdir -p ${PREFIX} + + git clone -b on_finalize https://github.com/light2802/hpx.git ${HPX_DIR} + + cd ${HPX_DIR} + cmake -DCMAKE_BUILD_TYPE=${BUILD_TYPE} \ + -DCMAKE_TOOLCHAIN_FILE="C:/projects/vcpkg/scripts/buildsystems/vcpkg.cmake" \ + -DHPX_WITH_THREAD_IDLE_RATES=ON \ + -DHPX_WITH_EXAMPLES=OFF \ + -DHPX_WITH_FETCH_ASIO=ON \ + -DHPX_WITH_DYNAMIC_HPX_MAIN=OFF \ + -Wdev -S ${HPX_DIR} -B ${HPX_DIR}/cmake-build/${BUILD_TYPE} \ + -G'Visual Studio 17 2022' + + cmake --build ${HPX_DIR}/cmake-build/${BUILD_TYPE}/ --parallel + + - name: Install HPXC + shell: bash + run: | + PREFIX="${CURRENT_DIR:=$(pwd)}" + + BUILD_TYPE=Release + HPXC_DIR=${PREFIX}/hpxc + HPX_DIR=${PREFIX}/hpx/cmake-build/${BUILD_TYPE}/lib/cmake/HPX + + mkdir -p ${PREFIX} + + git clone -b hpxmp https://github.com/light2802/hpxc.git ${HPXC_DIR} + + cmake \ + -DCMAKE_BUILD_TYPE=${BUILD_TYPE} \ + -DCMAKE_TOOLCHAIN_FILE="C:/projects/vcpkg/scripts/buildsystems/vcpkg.cmake" \ + -DHPX_DIR=${HPX_DIR} \ + -Wdev -S ${HPXC_DIR} -B ${HPXC_DIR}/cmake-build/${BUILD_TYPE} \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON + + cmake --build ${HPXC_DIR}/cmake-build/${BUILD_TYPE}/ --parallel + #cmake --install ${HPXC_DIR}/cmake-build/${BUILD_TYPE}/ --prefix ${HPXC_DIR}/cmake-install/${BUILD_TYPE} + + - name: Build hpxmp + run: | + $PREFIX = pwd + + $BUILD_TYPE = "Release" + $LLVM_DIR = "$($PREFIX)/llvm-project" + $LLVM_VERSION = "16.0.6" + $OMP_DIR = "$($LLVM_DIR)/openmp" + $HPX_DIR = "$($PREFIX)/hpx/cmake-build/$($BUILD_TYPE)/lib/cmake/HPX" + $HPXC_DIR = "$($PREFIX)/hpxc" + $PROJECT = "hpxmp" + $BUILD_DIR= "$($OMP_DIR)/cmake-build-$($PROJECT)/$($BUILD_TYPE)/" + + pip install psutil + + git clone --depth=1 -b hpxmp-v16 https://github.com/light2802/llvm-project.git $($LLVM_DIR) + + cmake ` + -DCMAKE_BUILD_TYPE=$($BUILD_TYPE) ` + -DHPX_DIR="$($HPX_DIR)" ` + -DWITH_HPXC=ON ` + -DHPXC_DIR="$($HPXC_DIR)" ` + -DOPENMP_ENABLE_LIBOMPTARGET=OFF ` + -DLIBOMP_OMPD_SUPPORT=OFF ` + -DLIBOMP_USE_STDCPPLIB:BOOL=TRUE ` + -DCMAKE_TOOLCHAIN_FILE="C:/projects/vcpkg/scripts/buildsystems/vcpkg.cmake" ` + -Wdev -S $($OMP_DIR) -B $($BUILD_DIR) ` + -G'Visual Studio 17 2022' + + cmake --build $($BUILD_DIR) --parallel + #cmake --install $($BUILD_DIR) --prefix "$($OMP_DIR)/cmake-install-$($PROJECT)/$($BUILD_TYPE)" + + # - name: Build OMP examples + # shell: bash + # run: | + # PREFIX="${CURRENT_DIR:=$(pwd)}" + + # EXAMPLE_PATH=${PREFIX}/running_examples + # BUILD_TYPE=Debug + # PROJECT=examples + + # mkdir -p ${PREFIX} + + # rm -rf ${EXAMPLE_PATH}/cmake-build-omp + + # cmake \ + # -DCMAKE_BUILD_TYPE=${BUILD_TYPE} \ + # -DCMAKE_VERBOSE_MAKEFILE=ON \ + # -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \ + # -DCMAKE_CXX_FLAGS="-std=c++17 -fopenmp" \ + # -DCMAKE_CXX_COMPILER=g++ \ + # -DCMAKE_C_COMPILER=gcc \ + # -DHPX_DIR=${HPX_DIR} \ + # -DOMP_LIB_PATH=${PREFIX}/llvm-project/openmp/cmake-install-omp/${BUILD_TYPE}/lib/libomp.so \ + # -Wdev -S ${EXAMPLE_PATH} -B ${EXAMPLE_PATH}/cmake-build-omp/${BUILD_TYPE} + + # cmake --build ${EXAMPLE_PATH}/cmake-build-omp/${BUILD_TYPE}/ --parallel + # cmake --install ${EXAMPLE_PATH}/cmake-build-omp/${BUILD_TYPE}/ --prefix ${EXAMPLE_PATH}/cmake-install-omp/${BUILD_TYPE} + + - name: Build HPXMP examples + shell: bash + run: | + PREFIX="${CURRENT_DIR:=$(pwd)}" + + EXAMPLE_PATH=${PREFIX}/running_examples + BUILD_TYPE=Release + HPX_DIR=${PREFIX}/hpx/cmake-install/${BUILD_TYPE}/lib/cmake/HPX + + mkdir -p ${PREFIX} + + rm -rf ${EXAMPLE_PATH}/cmake-build-hpxmp + + cmake \ + -DCMAKE_BUILD_TYPE=${BUILD_TYPE} \ + -DCMAKE_CXX_FLAGS="-fopenmp" \ + -DHPX_DIR=${HPX_DIR} \ + -DWITH_HPXC=ON \ + -DOMP_LIB_PATH=${PREFIX}/llvm-project/openmp/cmake-build-hpxmp/${BUILD_TYPE}/lib/libomp.so \ + -Wdev -S ${EXAMPLE_PATH} -B ${EXAMPLE_PATH}/cmake-build-hpxmp/${BUILD_TYPE} + + cmake --build ${EXAMPLE_PATH}/cmake-build-hpxmp/${BUILD_TYPE}/ --parallel + #cmake --install ${EXAMPLE_PATH}/cmake-build-hpxmp/${BUILD_TYPE}/ --prefix ${EXAMPLE_PATH}/cmake-install-hpxmp/${BUILD_TYPE} diff --git a/build-examples-new.sh b/build-examples-new.sh new file mode 100755 index 0000000..971114c --- /dev/null +++ b/build-examples-new.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +# Copyright (c) 2023 R. Tohid (@rtohid) +# +# 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) + +module load gcc/12.3.0 boost + +CURRENT_DIR=$1 +PREFIX="${CURRENT_DIR:=$(pwd)}" + +EXAMPLE_PATH=${PREFIX}/hpx_example +BUILD_TYPE=Debug +HPX_DIR=${PREFIX}/hpx/cmake-install/${BUILD_TYPE}/lib64/cmake/HPX + +mkdir -p ${PREFIX} + +rm -rf ${EXAMPLE_PATH}/cmake-build-hpxmp + +cmake \ + -DCMAKE_BUILD_TYPE=${BUILD_TYPE} \ + -DCMAKE_VERBOSE_MAKEFILE=ON \ + -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \ + -DCMAKE_CXX_FLAGS="-std=c++17 -fopenmp" \ + -DCMAKE_CXX_COMPILER=g++ \ + -DCMAKE_C_COMPILER=gcc \ + -DHPX_DIR=${HPX_DIR} \ + -DWITH_HPXC=ON \ + -DOMP_LIB_PATH=${PREFIX}/llvm-project/openmp/cmake-install-hpxmp/${BUILD_TYPE}/lib/libomp.so \ + -Wdev -S ${EXAMPLE_PATH} -B ${EXAMPLE_PATH}/cmake-build-hpxmp/${BUILD_TYPE} + +cmake --build ${EXAMPLE_PATH}/cmake-build-hpxmp/${BUILD_TYPE}/ --parallel +cmake --install ${EXAMPLE_PATH}/cmake-build-hpxmp/${BUILD_TYPE}/ --prefix ${EXAMPLE_PATH}/cmake-install-hpxmp/${BUILD_TYPE} + diff --git a/build-hpxmp.sh b/build-hpxmp.sh index 86405c8..ff5e73f 100755 --- a/build-hpxmp.sh +++ b/build-hpxmp.sh @@ -25,7 +25,7 @@ BUILD_DIR=${OMP_DIR}/cmake-build-${PROJECT}/${BUILD_TYPE}/ mkdir -p ${PREFIX} if [ ! -d ${LLVM_DIR} ]; then - git clone --depth=1 -b hpxc git@github.com:light2802/llvm-project.git ${LLVM_DIR} + git clone --depth=1 -b hpxmp-v16 https://github.com/light2802/llvm-project.git ${LLVM_DIR} fi rm -rf ${BUILD_DIR} diff --git a/hpx_example/CMakeLists.txt b/hpx_example/CMakeLists.txt new file mode 100644 index 0000000..4b16a55 --- /dev/null +++ b/hpx_example/CMakeLists.txt @@ -0,0 +1,23 @@ +# Copyright (c) 2023 R. Tohid (@rtohid) +# +# 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) + +cmake_minimum_required(VERSION 3.18) + +project(hpxMP C CXX) +option(WITH_HPXC "Use HPX threading system." OFF) +if (WITH_HPXC) + find_package(HPX REQUIRED) + add_definitions(-DHPXC) +endif() + +set(CMAKE_CXX_FLAGS "-fopenmp") + +add_executable(hello_world hello.cpp) +if (WITH_HPXC) + target_link_libraries(hello_world ${OMP_LIB_PATH} pthread HPX::hpx HPX::wrap_main) +else() + target_link_libraries(hello_world ${OMP_LIB_PATH} pthread) +endif() diff --git a/hpx_example/hello.cpp b/hpx_example/hello.cpp new file mode 100644 index 0000000..5a520cb --- /dev/null +++ b/hpx_example/hello.cpp @@ -0,0 +1,32 @@ +// Copyright (c) 2023 R. Tohid (@rtohid) +// +// 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) + +#include +#include + +#include +#include +#include +int hello() { + + std::cout << "Starting ..." << std::endl; + +#pragma omp parallel + { + std::cout << "Hello World, from thread: " << omp_get_thread_num() + << std::endl; + } + + return 0; +} + +int main(int argc, char* argv[]) +{ + hpx::start(nullptr, argc, argv); + hpx::post(&hello); + hpx::post([]() { hpx::disconnect(); }); + //return hpx::disconnect(); +} diff --git a/running_examples/CMakeLists.txt b/running_examples/CMakeLists.txt index 4b16a55..3def2ee 100644 --- a/running_examples/CMakeLists.txt +++ b/running_examples/CMakeLists.txt @@ -21,3 +21,26 @@ if (WITH_HPXC) else() target_link_libraries(hello_world ${OMP_LIB_PATH} pthread) endif() + +add_executable(barrier barrier.cpp) +if (WITH_HPXC) + target_link_libraries(barrier ${OMP_LIB_PATH} pthread HPX::hpx HPX::wrap_main) +else() + target_link_libraries(barrier ${OMP_LIB_PATH} pthread) +endif() + +add_executable(for for.cpp) +if (WITH_HPXC) + target_link_libraries(for ${OMP_LIB_PATH} pthread HPX::hpx HPX::wrap_main) +else() + target_link_libraries(for ${OMP_LIB_PATH} pthread) +endif() + +add_executable(atomic atomic.cpp) +if (WITH_HPXC) + target_link_libraries(atomic ${OMP_LIB_PATH} pthread HPX::hpx HPX::wrap_main) +else() + target_link_libraries(atomic ${OMP_LIB_PATH} pthread) +endif() + + diff --git a/running_examples/atomic.cpp b/running_examples/atomic.cpp new file mode 100644 index 0000000..86dd112 --- /dev/null +++ b/running_examples/atomic.cpp @@ -0,0 +1,20 @@ +#include +#include + +#ifdef HPXC +#include +#endif // HPXC + + +int main() { + int x=0; +#pragma omp parallel for + for (int i = 0; i<10000000; i++) + { + #pragma omp atomic + x++; + } + printf("x = %d\n", x); + if(x != 10000000) return 1; + return 0; +} diff --git a/running_examples/barrier.cpp b/running_examples/barrier.cpp new file mode 100644 index 0000000..4baac3e --- /dev/null +++ b/running_examples/barrier.cpp @@ -0,0 +1,25 @@ +#include +#include + +#ifdef HPXC +#include +#endif // HPXC + +int main () { + + int th_id, nthreads; + + #pragma omp parallel private(th_id) + { + th_id = omp_get_thread_num(); + printf("Hello World from thread %d\n", th_id); + + #pragma omp barrier + if ( th_id == 0 ) { + nthreads = omp_get_num_threads(); + printf("There are %d threads\n",nthreads); + } + } + + return 0; +} diff --git a/running_examples/for.cpp b/running_examples/for.cpp new file mode 100644 index 0000000..68c25f6 --- /dev/null +++ b/running_examples/for.cpp @@ -0,0 +1,17 @@ +#include +#include + +#ifdef HPXC +#include +#endif // HPXC + +int main () { + int a[1000]; + #pragma omp parallel for + for(int i = 1; i < 1000; ++i) + { + a[i] = i; + } + + return 0; +} diff --git a/running_examples/hello.cpp b/running_examples/hello.cpp index 4c1f3ab..e54f765 100644 --- a/running_examples/hello.cpp +++ b/running_examples/hello.cpp @@ -21,5 +21,6 @@ int main(int argc, char *argv[]) { << std::endl; } + //std::cout << "Threads running " << hpx::threads::get_thread_manager().get_thread_count() << std::endl; return 0; }