diff --git a/CMakeLists.txt b/CMakeLists.txt index d303c58865c77eaaa4873a7f4a4a09cfcbf1985e..4c080f8973a1b244344f26c52f792380805611a3 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 7186e0b0142ebe52f244845efc1e350000f6f7d2..75a370db29ee67b23bf84bf218e2f2bca9f2b607 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; }