function(mdspan_add_benchmark EXENAME) add_executable(${EXENAME} ${EXENAME}.cpp) target_link_libraries(${EXENAME} mdspan benchmark::benchmark) target_include_directories(${EXENAME} PUBLIC $ ) # Set flag to build with parenthesis enabled target_compile_definitions(${EXENAME} PRIVATE MDSPAN_USE_PAREN_OPERATOR=1) endfunction() find_package(benchmark REQUIRED) function(mdspan_add_cuda_benchmark EXENAME) add_executable(${EXENAME} ${EXENAME}.cu) target_link_libraries(${EXENAME} PUBLIC mdspan) target_include_directories(${EXENAME} PUBLIC $ ) # This is gross, but it's the best I can do in this version of CMake get_target_property(_benchmark_include benchmark::benchmark INTERFACE_INCLUDE_DIRECTORIES) get_target_property(_benchmark_libs_old benchmark::benchmark INTERFACE_LINK_LIBRARIES) get_target_property(_benchmark_libs_imported benchmark::benchmark IMPORTED_LOCATION_RELEASE) if(NOT _benchmark_libs_imported) get_target_property(_benchmark_libs_imported benchmark::benchmark IMPORTED_LOCATION_DEBUG) if(NOT _benchmark_libs_imported) get_target_property(_benchmark_libs_imported benchmark::benchmark IMPORTED_LOCATION_RELWITHDEBINFO) if(NOT _benchmark_libs_imported) get_target_property(_benchmark_libs_imported benchmark::benchmark IMPORTED_LOCATION_MINSIZEREL) if(NOT _benchmark_libs_imported) message(FATAL_ERROR "Could not figure out how to import google benchmark to hack around a cmake Cuda compatibility issue. Later versions of CMake will make this unnecessary" ) else() message(WARNING "Importing a Google Benchmark installation that was compiled in MinSizeRel mode. Times might not be reliable") endif() else() message(WARNING "Importing a Google Benchmark installation that was compiled in RelWithDebInfo mode. Times might not be reliable") endif() else() message(WARNING "Importing a Google Benchmark installation that was compiled in Debug mode. Times might not be reliable") endif() endif() string(REPLACE "-pthread" "" _benchmark_libs "${_benchmark_libs_old}") target_include_directories(${EXENAME} PUBLIC "${_benchmark_include}") target_link_libraries(${EXENAME} PUBLIC "${_benchmark_libs};${_benchmark_libs_imported}") target_compile_definitions(${EXENAME} PRIVATE MDSPAN_USE_PAREN_OPERATOR=1) if(_benchmark_libs_old MATCHES "-pthread") target_compile_options(${EXENAME} PUBLIC "-Xcompiler=-pthread") endif() endfunction() if(MDSPAN_ENABLE_OPENMP) find_package(OpenMP) endif() function(mdspan_add_openmp_benchmark EXENAME) if(MDSPAN_ENABLE_OPENMP) if(OpenMP_CXX_FOUND) add_executable(${EXENAME} ${EXENAME}.cpp) target_link_libraries(${EXENAME} mdspan benchmark::benchmark OpenMP::OpenMP_CXX) target_include_directories(${EXENAME} PUBLIC $ ) target_compile_definitions(${EXENAME} PRIVATE MDSPAN_USE_PAREN_OPERATOR=1) else() message(WARNING "Not adding target ${EXENAME} because OpenMP was not found") endif() endif() endfunction() add_subdirectory(sum) add_subdirectory(matvec) add_subdirectory(copy) add_subdirectory(stencil) add_subdirectory(tiny_matrix_add)