411 lines
13 KiB
CMake
411 lines
13 KiB
CMake
# -----------------------------------------------------------------------------
|
|
# eigen package
|
|
# -----------------------------------------------------------------------------
|
|
if(NOT DEFINED EIGEN_ROOT)
|
|
set(EIGEN_ROOT ${PROJECT_SOURCE_DIR}/3rd-party/eigen-3.3.7)
|
|
endif()
|
|
include_directories(${EIGEN_ROOT})
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# find OpenMP package
|
|
# -----------------------------------------------------------------------------
|
|
include(FindOpenMP)
|
|
|
|
if(NOT OpenMP_CXX_FOUND)
|
|
message(FATAL_ERROR "OpenMP not found")
|
|
endif()
|
|
|
|
message(STATUS "OpenMP_VERSION: ${OpenMP_VERSION}")
|
|
message(STATUS "OpenMP_CXX_FLAGS: ${OpenMP_CXX_FLAGS}")
|
|
message(STATUS "OpenMP_CXX_LIBRARIES: ${OpenMP_CXX_LIBRARIES}")
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# tbb package
|
|
# -----------------------------------------------------------------------------
|
|
cmake_policy(PUSH)
|
|
cmake_policy(SET CMP0074 NEW)
|
|
if(NOT DEFINED TBB_ROOT_DIR)
|
|
set(TBB_ROOT_DIR ${TF_3RD_PARTY_DIR}/tbb)
|
|
endif()
|
|
|
|
include(${TBB_ROOT_DIR}/cmake/TBBBuild.cmake)
|
|
#tbb_build(TBB_ROOT ${TBB_ROOT_DIR} CONFIG_DIR TBB_DIR MAKE_ARGS tbb_cpf=1)
|
|
tbb_build(TBB_ROOT ${TBB_ROOT_DIR} CONFIG_DIR TBB_DIR)
|
|
unset(TBB_ROOT) # unset is needed to pop CMP0074 without warning
|
|
cmake_policy(POP)
|
|
#find_package(TBB REQUIRED tbb_preview)
|
|
find_package(TBB REQUIRED)
|
|
#cmake_policy(POP)
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Benchmarks
|
|
# -----------------------------------------------------------------------------
|
|
|
|
## benchmark 1: wavefront computing
|
|
add_executable(
|
|
bench_wavefront
|
|
${TF_BENCHMARK_DIR}/wavefront/main.cpp
|
|
${TF_BENCHMARK_DIR}/wavefront/omp.cpp
|
|
${TF_BENCHMARK_DIR}/wavefront/tbb.cpp
|
|
${TF_BENCHMARK_DIR}/wavefront/seq.cpp
|
|
${TF_BENCHMARK_DIR}/wavefront/taskflow.cpp
|
|
)
|
|
target_include_directories(bench_wavefront PRIVATE ${PROJECT_SOURCE_DIR}/3rd-party/CLI11)
|
|
target_link_libraries(
|
|
bench_wavefront
|
|
${PROJECT_NAME}
|
|
${TBB_IMPORTED_TARGETS}
|
|
${OpenMP_CXX_LIBRARIES}
|
|
tf::default_settings
|
|
)
|
|
set_target_properties(bench_wavefront PROPERTIES COMPILE_FLAGS ${OpenMP_CXX_FLAGS})
|
|
|
|
## benchmark 2: graph traversal
|
|
add_executable(
|
|
bench_graph_traversal
|
|
${TF_BENCHMARK_DIR}/graph_traversal/main.cpp
|
|
${TF_BENCHMARK_DIR}/graph_traversal/omp.cpp
|
|
${TF_BENCHMARK_DIR}/graph_traversal/tbb.cpp
|
|
${TF_BENCHMARK_DIR}/graph_traversal/seq.cpp
|
|
${TF_BENCHMARK_DIR}/graph_traversal/taskflow.cpp
|
|
)
|
|
target_include_directories(bench_graph_traversal PRIVATE ${PROJECT_SOURCE_DIR}/3rd-party/CLI11)
|
|
target_link_libraries(
|
|
bench_graph_traversal
|
|
${PROJECT_NAME}
|
|
${TBB_IMPORTED_TARGETS}
|
|
${OpenMP_CXX_LIBRARIES}
|
|
tf::default_settings
|
|
)
|
|
set_target_properties(bench_graph_traversal PROPERTIES COMPILE_FLAGS ${OpenMP_CXX_FLAGS})
|
|
|
|
## benchmark 3: binary_tree
|
|
add_executable(
|
|
bench_binary_tree
|
|
${TF_BENCHMARK_DIR}/binary_tree/main.cpp
|
|
${TF_BENCHMARK_DIR}/binary_tree/tbb.cpp
|
|
${TF_BENCHMARK_DIR}/binary_tree/omp.cpp
|
|
${TF_BENCHMARK_DIR}/binary_tree/taskflow.cpp
|
|
)
|
|
target_include_directories(bench_binary_tree PRIVATE ${PROJECT_SOURCE_DIR}/3rd-party/CLI11)
|
|
target_link_libraries(
|
|
bench_binary_tree
|
|
${PROJECT_NAME}
|
|
${TBB_IMPORTED_TARGETS}
|
|
${OpenMP_CXX_LIBRARIES}
|
|
tf::default_settings
|
|
)
|
|
set_target_properties(bench_binary_tree PROPERTIES COMPILE_FLAGS ${OpenMP_CXX_FLAGS})
|
|
|
|
## benchmark 4: linear_chain
|
|
add_executable(
|
|
bench_linear_chain
|
|
${TF_BENCHMARK_DIR}/linear_chain/main.cpp
|
|
${TF_BENCHMARK_DIR}/linear_chain/tbb.cpp
|
|
${TF_BENCHMARK_DIR}/linear_chain/omp.cpp
|
|
${TF_BENCHMARK_DIR}/linear_chain/taskflow.cpp
|
|
)
|
|
target_include_directories(bench_linear_chain PRIVATE ${PROJECT_SOURCE_DIR}/3rd-party/CLI11)
|
|
target_link_libraries(
|
|
bench_linear_chain
|
|
${PROJECT_NAME}
|
|
${TBB_IMPORTED_TARGETS}
|
|
${OpenMP_CXX_LIBRARIES}
|
|
tf::default_settings
|
|
)
|
|
set_target_properties(bench_linear_chain PROPERTIES COMPILE_FLAGS ${OpenMP_CXX_FLAGS})
|
|
|
|
## benchmark 5: MNIST
|
|
add_executable(
|
|
bench_mnist
|
|
${TF_BENCHMARK_DIR}/mnist/main.cpp
|
|
${TF_BENCHMARK_DIR}/mnist/omp.cpp
|
|
${TF_BENCHMARK_DIR}/mnist/tbb.cpp
|
|
${TF_BENCHMARK_DIR}/mnist/seq.cpp
|
|
${TF_BENCHMARK_DIR}/mnist/taskflow.cpp
|
|
)
|
|
target_include_directories(bench_mnist PRIVATE ${PROJECT_SOURCE_DIR}/3rd-party/CLI11)
|
|
target_link_libraries(
|
|
bench_mnist
|
|
${PROJECT_NAME}
|
|
${TBB_IMPORTED_TARGETS}
|
|
${OpenMP_CXX_LIBRARIES}
|
|
stdc++fs
|
|
tf::default_settings
|
|
)
|
|
set_target_properties(bench_mnist PROPERTIES COMPILE_FLAGS ${OpenMP_CXX_FLAGS})
|
|
|
|
## benchmark 6: matrix multiplication
|
|
add_executable(
|
|
bench_matrix_multiplication
|
|
${TF_BENCHMARK_DIR}/matrix_multiplication/main.cpp
|
|
${TF_BENCHMARK_DIR}/matrix_multiplication/omp.cpp
|
|
${TF_BENCHMARK_DIR}/matrix_multiplication/tbb.cpp
|
|
${TF_BENCHMARK_DIR}/matrix_multiplication/taskflow.cpp
|
|
)
|
|
target_include_directories(bench_matrix_multiplication PRIVATE ${PROJECT_SOURCE_DIR}/3rd-party/CLI11)
|
|
target_link_libraries(
|
|
bench_matrix_multiplication
|
|
${PROJECT_NAME}
|
|
${TBB_IMPORTED_TARGETS}
|
|
${OpenMP_CXX_LIBRARIES}
|
|
tf::default_settings
|
|
)
|
|
set_target_properties(bench_matrix_multiplication PROPERTIES COMPILE_FLAGS ${OpenMP_CXX_FLAGS})
|
|
|
|
## benchmark 7: mandelbrot
|
|
add_executable(
|
|
bench_mandelbrot
|
|
${TF_BENCHMARK_DIR}/mandelbrot/main.cpp
|
|
${TF_BENCHMARK_DIR}/mandelbrot/omp.cpp
|
|
${TF_BENCHMARK_DIR}/mandelbrot/tbb.cpp
|
|
${TF_BENCHMARK_DIR}/mandelbrot/taskflow.cpp
|
|
)
|
|
target_include_directories(bench_mandelbrot PRIVATE ${PROJECT_SOURCE_DIR}/3rd-party/CLI11)
|
|
target_link_libraries(
|
|
bench_mandelbrot
|
|
${PROJECT_NAME}
|
|
${TBB_IMPORTED_TARGETS}
|
|
${OpenMP_CXX_LIBRARIES}
|
|
tf::default_settings
|
|
)
|
|
set_target_properties(bench_mandelbrot PROPERTIES COMPILE_FLAGS ${OpenMP_CXX_FLAGS})
|
|
|
|
## benchmark 8: black_scholes
|
|
add_executable(
|
|
bench_black_scholes
|
|
${TF_BENCHMARK_DIR}/black_scholes/main.cpp
|
|
${TF_BENCHMARK_DIR}/black_scholes/omp.cpp
|
|
${TF_BENCHMARK_DIR}/black_scholes/tbb.cpp
|
|
${TF_BENCHMARK_DIR}/black_scholes/taskflow.cpp
|
|
)
|
|
target_include_directories(bench_black_scholes PRIVATE ${PROJECT_SOURCE_DIR}/3rd-party/CLI11)
|
|
target_link_libraries(
|
|
bench_black_scholes
|
|
${PROJECT_NAME}
|
|
${TBB_IMPORTED_TARGETS}
|
|
${OpenMP_CXX_LIBRARIES}
|
|
tf::default_settings
|
|
)
|
|
set_target_properties(bench_black_scholes PROPERTIES COMPILE_FLAGS ${OpenMP_CXX_FLAGS})
|
|
|
|
## benchmark 9: reduce_sum
|
|
add_executable(
|
|
bench_reduce_sum
|
|
${TF_BENCHMARK_DIR}/reduce_sum/main.cpp
|
|
${TF_BENCHMARK_DIR}/reduce_sum/omp.cpp
|
|
${TF_BENCHMARK_DIR}/reduce_sum/tbb.cpp
|
|
${TF_BENCHMARK_DIR}/reduce_sum/taskflow.cpp
|
|
)
|
|
target_include_directories(bench_reduce_sum PRIVATE ${PROJECT_SOURCE_DIR}/3rd-party/CLI11)
|
|
target_link_libraries(
|
|
bench_reduce_sum
|
|
${PROJECT_NAME}
|
|
${TBB_IMPORTED_TARGETS}
|
|
${OpenMP_CXX_LIBRARIES}
|
|
tf::default_settings
|
|
)
|
|
set_target_properties(bench_reduce_sum PROPERTIES COMPILE_FLAGS ${OpenMP_CXX_FLAGS})
|
|
|
|
## benchmark 10: sort
|
|
add_executable(
|
|
bench_sort
|
|
${TF_BENCHMARK_DIR}/sort/main.cpp
|
|
${TF_BENCHMARK_DIR}/sort/omp.cpp
|
|
${TF_BENCHMARK_DIR}/sort/tbb.cpp
|
|
${TF_BENCHMARK_DIR}/sort/taskflow.cpp
|
|
)
|
|
target_include_directories(bench_sort PRIVATE ${PROJECT_SOURCE_DIR}/3rd-party/CLI11)
|
|
target_link_libraries(
|
|
bench_sort
|
|
${PROJECT_NAME}
|
|
${TBB_IMPORTED_TARGETS}
|
|
${OpenMP_CXX_LIBRARIES}
|
|
tf::default_settings
|
|
)
|
|
set_target_properties(bench_sort PROPERTIES COMPILE_FLAGS ${OpenMP_CXX_FLAGS})
|
|
|
|
|
|
## benchmark 11: linear_pipeline
|
|
add_executable(
|
|
bench_linear_pipeline
|
|
${TF_BENCHMARK_DIR}/linear_pipeline/main.cpp
|
|
${TF_BENCHMARK_DIR}/linear_pipeline/omp.cpp
|
|
${TF_BENCHMARK_DIR}/linear_pipeline/tbb.cpp
|
|
${TF_BENCHMARK_DIR}/linear_pipeline/taskflow.cpp
|
|
)
|
|
target_include_directories(bench_linear_pipeline PRIVATE ${PROJECT_SOURCE_DIR}/3rd-party/CLI11)
|
|
target_link_libraries(
|
|
bench_linear_pipeline
|
|
${PROJECT_NAME}
|
|
${TBB_IMPORTED_TARGETS}
|
|
${OpenMP_CXX_LIBRARIES}
|
|
tf::default_settings
|
|
)
|
|
set_target_properties(bench_linear_pipeline PROPERTIES COMPILE_FLAGS ${OpenMP_CXX_FLAGS})
|
|
|
|
|
|
## benchmark 12: graph_pipeline
|
|
add_executable(
|
|
bench_graph_pipeline
|
|
${TF_BENCHMARK_DIR}/graph_pipeline/main.cpp
|
|
${TF_BENCHMARK_DIR}/graph_pipeline/omp.cpp
|
|
${TF_BENCHMARK_DIR}/graph_pipeline/tbb.cpp
|
|
${TF_BENCHMARK_DIR}/graph_pipeline/taskflow.cpp
|
|
${TF_BENCHMARK_DIR}/graph_pipeline/gold.cpp
|
|
#${TF_BENCHMARK_DIR}/graph_pipeline/fastflow.cpp
|
|
)
|
|
target_include_directories(bench_graph_pipeline PRIVATE ${PROJECT_SOURCE_DIR}/3rd-party/CLI11)
|
|
target_include_directories(bench_graph_pipeline PRIVATE ${PROJECT_SOURCE_DIR}/3rd-party/)
|
|
target_link_libraries(
|
|
bench_graph_pipeline
|
|
${PROJECT_NAME}
|
|
${TBB_IMPORTED_TARGETS}
|
|
${OpenMP_CXX_LIBRARIES}
|
|
tf::default_settings
|
|
)
|
|
set_target_properties(bench_graph_pipeline PROPERTIES COMPILE_FLAGS ${OpenMP_CXX_FLAGS})
|
|
|
|
## benchmark 13: comparison with simple thread pool
|
|
add_executable(
|
|
bench_thread_pool
|
|
${TF_BENCHMARK_DIR}/thread_pool/thread_pool.cpp
|
|
)
|
|
target_include_directories(bench_thread_pool PRIVATE ${PROJECT_SOURCE_DIR}/3rd-party/CLI11)
|
|
target_link_libraries(
|
|
bench_thread_pool
|
|
${PROJECT_NAME}
|
|
${TBB_IMPORTED_TARGETS}
|
|
${OpenMP_CXX_LIBRARIES}
|
|
tf::default_settings
|
|
)
|
|
set_target_properties(bench_thread_pool PROPERTIES COMPILE_FLAGS ${OpenMP_CXX_FLAGS})
|
|
|
|
## benchmark 14: data_pipeline
|
|
add_executable(
|
|
bench_data_pipeline
|
|
${TF_BENCHMARK_DIR}/data_pipeline/main.cpp
|
|
${TF_BENCHMARK_DIR}/data_pipeline/tbb.cpp
|
|
${TF_BENCHMARK_DIR}/data_pipeline/taskflow.cpp
|
|
)
|
|
target_include_directories(bench_data_pipeline PRIVATE ${PROJECT_SOURCE_DIR}/3rd-party/CLI11)
|
|
target_link_libraries(
|
|
bench_data_pipeline
|
|
${PROJECT_NAME}
|
|
${TBB_IMPORTED_TARGETS}
|
|
${OpenMP_CXX_LIBRARIES}
|
|
tf::default_settings
|
|
)
|
|
set_target_properties(bench_data_pipeline PROPERTIES COMPILE_FLAGS ${OpenMP_CXX_FLAGS})
|
|
|
|
## benchmark 15: deferred_pipeline
|
|
add_executable(
|
|
bench_deferred_pipeline
|
|
${TF_BENCHMARK_DIR}/deferred_pipeline/main.cpp
|
|
${TF_BENCHMARK_DIR}/deferred_pipeline/pthread.cpp
|
|
${TF_BENCHMARK_DIR}/deferred_pipeline/taskflow.cpp
|
|
)
|
|
target_include_directories(bench_deferred_pipeline PRIVATE ${PROJECT_SOURCE_DIR}/3rd-party/CLI11)
|
|
target_link_libraries(
|
|
bench_deferred_pipeline
|
|
${PROJECT_NAME}
|
|
${OpenMP_CXX_LIBRARIES}
|
|
tf::default_settings
|
|
)
|
|
set_target_properties(bench_deferred_pipeline PROPERTIES COMPILE_FLAGS ${OpenMP_CXX_FLAGS})
|
|
|
|
## benchmark 16: for_each
|
|
add_executable(
|
|
bench_for_each
|
|
${TF_BENCHMARK_DIR}/for_each/main.cpp
|
|
${TF_BENCHMARK_DIR}/for_each/omp.cpp
|
|
${TF_BENCHMARK_DIR}/for_each/tbb.cpp
|
|
${TF_BENCHMARK_DIR}/for_each/taskflow.cpp
|
|
)
|
|
target_include_directories(bench_for_each PRIVATE ${PROJECT_SOURCE_DIR}/3rd-party/CLI11)
|
|
target_link_libraries(
|
|
bench_for_each
|
|
${PROJECT_NAME}
|
|
${TBB_IMPORTED_TARGETS}
|
|
${OpenMP_CXX_LIBRARIES}
|
|
tf::default_settings
|
|
)
|
|
set_target_properties(bench_for_each PROPERTIES COMPILE_FLAGS ${OpenMP_CXX_FLAGS})
|
|
|
|
## benchmark 17: scan
|
|
add_executable(
|
|
bench_scan
|
|
${TF_BENCHMARK_DIR}/scan/main.cpp
|
|
${TF_BENCHMARK_DIR}/scan/omp.cpp
|
|
${TF_BENCHMARK_DIR}/scan/tbb.cpp
|
|
${TF_BENCHMARK_DIR}/scan/taskflow.cpp
|
|
)
|
|
target_include_directories(bench_scan PRIVATE ${PROJECT_SOURCE_DIR}/3rd-party/CLI11)
|
|
target_link_libraries(
|
|
bench_scan
|
|
${PROJECT_NAME}
|
|
${TBB_IMPORTED_TARGETS}
|
|
${OpenMP_CXX_LIBRARIES}
|
|
tf::default_settings
|
|
)
|
|
set_target_properties(bench_scan PROPERTIES COMPILE_FLAGS ${OpenMP_CXX_FLAGS})
|
|
|
|
## benchmark 18: async_task
|
|
add_executable(
|
|
bench_async_task
|
|
${TF_BENCHMARK_DIR}/async_task/main.cpp
|
|
${TF_BENCHMARK_DIR}/async_task/omp.cpp
|
|
${TF_BENCHMARK_DIR}/async_task/std.cpp
|
|
${TF_BENCHMARK_DIR}/async_task/taskflow.cpp
|
|
)
|
|
target_include_directories(bench_async_task PRIVATE ${PROJECT_SOURCE_DIR}/3rd-party/CLI11)
|
|
target_link_libraries(
|
|
bench_async_task
|
|
${PROJECT_NAME}
|
|
${TBB_IMPORTED_TARGETS}
|
|
${OpenMP_CXX_LIBRARIES}
|
|
tf::default_settings
|
|
)
|
|
set_target_properties(bench_async_task PROPERTIES COMPILE_FLAGS ${OpenMP_CXX_FLAGS})
|
|
|
|
###############################################################################
|
|
# CUDA benchmarks
|
|
###############################################################################
|
|
|
|
if(TF_BUILD_CUDA)
|
|
|
|
## cuda benchmark 1: heterogeneous traversal
|
|
add_executable(
|
|
hetero_traversal
|
|
${TF_BENCHMARK_DIR}/hetero_traversal/main.cu
|
|
${TF_BENCHMARK_DIR}/hetero_traversal/taskflow.cu
|
|
${TF_BENCHMARK_DIR}/hetero_traversal/tbb.cu
|
|
${TF_BENCHMARK_DIR}/hetero_traversal/omp.cu
|
|
)
|
|
|
|
target_include_directories(
|
|
hetero_traversal PRIVATE ${PROJECT_SOURCE_DIR}/3rd-party/CLI11
|
|
)
|
|
|
|
target_link_libraries(
|
|
hetero_traversal
|
|
${PROJECT_NAME}
|
|
Threads::Threads
|
|
${TBB_IMPORTED_TARGETS}
|
|
${OpenMP_CXX_LIBRARIES}
|
|
tf::default_settings
|
|
)
|
|
|
|
set_target_properties(
|
|
hetero_traversal PROPERTIES COMPILE_FLAGS "-Xcompiler ${OpenMP_CXX_FLAGS}"
|
|
)
|
|
|
|
# avoid cmake 3.18+ warning
|
|
# we let nvcc to decide the flag if the architecture is not given
|
|
if(NOT CUDA_ARCHITECTURES)
|
|
set_property(TARGET hetero_traversal PROPERTY CUDA_ARCHITECTURES OFF)
|
|
endif()
|
|
|
|
|
|
endif(TF_BUILD_CUDA)
|
|
|