From 1cf8f66c84d4021ff37594181e4b62fd6e990ee5 Mon Sep 17 00:00:00 2001
From: Sebastian Eibl <sebastian.eibl@mpcdf.mpg.de>
Date: Fri, 1 Apr 2022 16:07:26 +0200
Subject: [PATCH] move feature space to gpu

---
 .../LossFunctionLogPearsonRMSE.cpp            | 10 ++---
 .../LossFunctionLogPearsonRMSE.hpp            |  2 +-
 src/loss_function/LossFunctionPearsonRMSE.cpp | 44 ++++++++++---------
 src/loss_function/LossFunctionPearsonRMSE.hpp |  3 +-
 4 files changed, 32 insertions(+), 27 deletions(-)

diff --git a/src/loss_function/LossFunctionLogPearsonRMSE.cpp b/src/loss_function/LossFunctionLogPearsonRMSE.cpp
index bb7c63a9..422f6f05 100644
--- a/src/loss_function/LossFunctionLogPearsonRMSE.cpp
+++ b/src/loss_function/LossFunctionLogPearsonRMSE.cpp
@@ -64,19 +64,19 @@ void LossFunctionLogPearsonRMSE::set_a(const std::vector<int>& inds, int taskind
     }
 }
 
-void LossFunctionLogPearsonRMSE::set_a(const std::vector<std::vector<int>>& feature_indices,
+void LossFunctionLogPearsonRMSE::set_a(Kokkos::View<int**, Kokkos::LayoutLeft> models,
                                        int taskind,
                                        int start)
 {
-    for (int model_idx = 0; model_idx < feature_indices.size(); ++model_idx)
+    for (int model_idx = 0; model_idx < models.extent(1); ++model_idx)
     {
-        for (int ff = 0; ff < feature_indices[model_idx].size(); ++ff)
+        for (int feature_idx = 0; feature_idx < models.extent(0); ++feature_idx)
         {
-            double* val_ptr = node_value_arrs::get_d_matrix_ptr(feature_indices[model_idx][ff]) +
+            double* val_ptr = node_value_arrs::get_d_matrix_ptr(models(feature_idx, model_idx)) +
                               start;
             std::transform(val_ptr,
                            val_ptr + _task_sizes_train[taskind],
-                           &_a(0, ff, model_idx),
+                           &_a(0, feature_idx, model_idx),
                            [](double val) { return std::log(val); });
         }
     }
diff --git a/src/loss_function/LossFunctionLogPearsonRMSE.hpp b/src/loss_function/LossFunctionLogPearsonRMSE.hpp
index 29232992..3d85c1a5 100644
--- a/src/loss_function/LossFunctionLogPearsonRMSE.hpp
+++ b/src/loss_function/LossFunctionLogPearsonRMSE.hpp
@@ -97,7 +97,7 @@ public:
      */
     void set_a(const std::vector<int>& inds, int taskind, int start);
 
-    void set_a(const std::vector<std::vector<int>>& feature_indices, int taskind, int start) override;
+    void set_a(Kokkos::View<int**, Kokkos::LayoutLeft> models, int taskind, int start) override;
 
     /**
      * @brief Set the A matrix used for solving the least squares regression
diff --git a/src/loss_function/LossFunctionPearsonRMSE.cpp b/src/loss_function/LossFunctionPearsonRMSE.cpp
index 07e8d34e..ebea62fa 100644
--- a/src/loss_function/LossFunctionPearsonRMSE.cpp
+++ b/src/loss_function/LossFunctionPearsonRMSE.cpp
@@ -86,6 +86,7 @@ LossFunctionPearsonRMSE::LossFunctionPearsonRMSE(std::vector<double> prop_train,
       _c("c", _n_task),
       _training_properties("batched_scores", 0),
       _batched_scores("batched_scores"),
+      _models("models", _n_feat),
       _lwork(0),
       _estimated_training_properties("estimated_training_properties", 0)
 {
@@ -114,6 +115,7 @@ LossFunctionPearsonRMSE::LossFunctionPearsonRMSE(std::shared_ptr<LossFunction> o
       _c("c", _n_task),
       _training_properties("batched_scores", 0),
       _batched_scores("batched_scores"),
+      _models("models", _n_feat),
       _lwork(0),
       _estimated_training_properties("estimated_training_properties", 0)
 {
@@ -142,6 +144,7 @@ LossFunctionPearsonRMSE::LossFunctionPearsonRMSE(const LossFunctionPearsonRMSE&
       _c("c", _n_task),
       _training_properties("batched_scores", 0),
       _batched_scores("batched_scores"),
+      _models("models", _n_feat),
       _lwork(0),
       _estimated_training_properties("estimated_training_properties", 0)
 {
@@ -218,6 +221,8 @@ void LossFunctionPearsonRMSE::set_nfeat(int n_feat)
     {
         _training_properties(material_idx) = _prop_train[material_idx];
     }
+
+    Kokkos::resize(_models, _n_feat);
 }
 
 void LossFunctionPearsonRMSE::reset_projection_prop(
@@ -324,17 +329,27 @@ Kokkos::View<double*> LossFunctionPearsonRMSE::operator()(
     const size_t batch_size = feature_indices.size();
     assert(batch_size <= MAX_BATCHES);
 
+    assert(feature_indices.size() <= _models.extent(1));
+    assert(feature_indices[0].size() == _models.extent(0));
+    for (int model_idx = 0; model_idx < feature_indices.size(); ++model_idx)
+    {
+        for (int ff = 0; ff < feature_indices[model_idx].size(); ++ff)
+        {
+            _models(ff, model_idx) = feature_indices[model_idx][ff];
+        }
+    }
+
     int start = 0;
     for (int task_idx = 0; task_idx < _n_task; ++task_idx)
     {
         Kokkos::deep_copy(_a, 1.0);
-        set_a(feature_indices, task_idx, start);
+        set_a(_models, task_idx, start);
         set_b(task_idx, start);
         Kokkos::fence();
         least_squares(task_idx, start);
 
         Kokkos::deep_copy(_a, 1.0);
-        set_a(feature_indices, task_idx, start);
+        set_a(_models, task_idx, start);
         Kokkos::fence();
         set_prop_train_est(_estimated_training_properties, task_idx, start);
 
@@ -392,36 +407,25 @@ double LossFunctionPearsonRMSE::test_loss(const std::vector<model_node_ptr>& fea
 
 void LossFunctionPearsonRMSE::set_a(const std::vector<int>& inds, int taskind, int start)
 {
-    set_a(std::vector<std::vector<int>>(1, inds), taskind, start);
+    for (int ff = 0; ff < inds.size(); ++ff)
+    {
+        _models(ff, 0) = inds[ff];
+    }
+    set_a(_models, taskind, start);
 }
 
-void LossFunctionPearsonRMSE::set_a(const std::vector<std::vector<int>>& feature_indices,
+void LossFunctionPearsonRMSE::set_a(Kokkos::View<int**, Kokkos::LayoutLeft> models,
                                     int taskind,
                                     int start)
 {
-    Kokkos::View<int**, Kokkos::LayoutLeft> models(
-        "models", feature_indices[0].size(), feature_indices.size());
-    auto max_idx = 0;
-    for (int model_idx = 0; model_idx < feature_indices.size(); ++model_idx)
-    {
-        for (int ff = 0; ff < feature_indices[model_idx].size(); ++ff)
-        {
-            models(ff, model_idx) = feature_indices[model_idx][ff];
-            max_idx = std::max(max_idx, feature_indices[model_idx][ff]);
-        }
-    }
-
     assert(_descriptor_matrix.extent(0) >= _task_sizes_train[taskind] + start);
-    assert(_descriptor_matrix.extent(1) > max_idx);
     Kokkos::deep_copy(_a, 1.0);
     auto a = _a;
     auto descriptor_matrix = _descriptor_matrix;
 
     auto policy = Kokkos::MDRangePolicy<Kokkos::Rank<3>>(
         {0, 0, 0},
-        {static_cast<size_t>(_task_sizes_train[taskind]),
-         feature_indices[0].size(),
-         feature_indices.size()});
+        {static_cast<size_t>(_task_sizes_train[taskind]), models.extent(0), models.extent(1)});
     auto kernel = KOKKOS_LAMBDA(const int sample_idx, const int feature_idx, const int model_idx)
     {
         a(sample_idx, feature_idx, model_idx) = descriptor_matrix(sample_idx + start,
diff --git a/src/loss_function/LossFunctionPearsonRMSE.hpp b/src/loss_function/LossFunctionPearsonRMSE.hpp
index 246fcd8c..0b7757aa 100644
--- a/src/loss_function/LossFunctionPearsonRMSE.hpp
+++ b/src/loss_function/LossFunctionPearsonRMSE.hpp
@@ -56,6 +56,7 @@ protected:
     Kokkos::View<double*> _work;    //!< Work vector for dgels
     Kokkos::View<double*> _training_properties;
     Kokkos::View<double[MAX_BATCHES]> _batched_scores;
+    Kokkos::View<int*[MAX_BATCHES], Kokkos::LayoutLeft> _models;
 
     Kokkos::View<double**, Kokkos::LayoutLeft> _descriptor_matrix;
     Kokkos::View<double* [MAX_BATCHES], Kokkos::LayoutLeft> _estimated_training_properties;
@@ -175,7 +176,7 @@ public:
      */
     virtual void set_a(const std::vector<int>& inds, int taskind, int start);
 
-    virtual void set_a(const std::vector<std::vector<int>>& feature_indices, int taskind, int start);
+    virtual void set_a(Kokkos::View<int**, Kokkos::LayoutLeft> models, int taskind, int start);
 
     /**
      * @brief Set the A matrix used for solving the least squares regression
-- 
GitLab