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