From 77fcd70d9c9ddcb48779eb96990e2bbef1cc9904 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Del=20Pino?= <stephane.delpino44@gmail.com> Date: Sun, 11 Mar 2018 00:41:20 +0100 Subject: [PATCH] Initial Kokkos usage. --- CMakeLists.txt | 7 +++++++ main.cpp | 43 +++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d303c5886..4c080f897 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,4 +25,11 @@ if (${CMAKE_BINARY_DIR} MATCHES "^${CMAKE_SOURCE_DIR}") endif() project (Pastis) + +list(APPEND CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -O3) + +add_subdirectory(${CMAKE_SOURCE_DIR}/packages/kokkos) +include_directories(${Kokkos_INCLUDE_DIRS_RET}) + add_executable(pastis main.cpp) +target_link_libraries(pastis kokkos) diff --git a/main.cpp b/main.cpp index 7186e0b01..75a370db2 100644 --- a/main.cpp +++ b/main.cpp @@ -1,7 +1,46 @@ #include <iostream> +#include <Kokkos_Core.hpp> -int main(int argc, char **argv) +int main(int argc, char *argv[]) { std::cout << "It's pastis time!\n"; - return 0; + std::cout << "-----------------\n"; + + Kokkos::initialize(argc, argv); + Kokkos::DefaultExecutionSpace::print_configuration(std::cout); + + if (argc < 2) { + fprintf(stderr, "Usage: %s [<kokkos_options>] <size>\n", argv[0]); + Kokkos::finalize(); + exit(1); + } + + const long n = strtol(argv[1], NULL, 10); + std::cout << "Number of even integers from 0 to " << n - 1 << '\n'; + + Kokkos::Timer timer; + timer.reset(); + + // Compute the number of even integers from 0 to n-1, in parallel. + long count = 0; + Kokkos::parallel_reduce(n, KOKKOS_LAMBDA (const long i, long& lcount) { + lcount += (i % 2) == 0; + }, count); + + double count_time = timer.seconds(); + std::cout << " Parallel: " << count << " " << count_time << '\n'; + + timer.reset(); + + // Compare to a sequential loop. + long seq_count = 0; + for (long i = 0; i < n; ++i) { + seq_count += (i % 2) == 0; + } + + count_time = timer.seconds(); + std::cout << "Sequential: " << seq_count << ' ' << count_time << '\n'; + Kokkos::finalize(); + + return (count == seq_count) ? 0 : -1; } -- GitLab