[GPU/OpenCL] Moving Addition kernel to Tensor Directory
authorYash Singh <yash.singh@samsung.com>
Wed, 3 Jul 2024 08:42:46 +0000 (14:12 +0530)
committerJijoong Moon <jijoong.moon@samsung.com>
Thu, 4 Jul 2024 06:53:09 +0000 (15:53 +0900)
Moved addition_cl kernel to Tensor directory.
Refactored addition_cl for generalization.

Signed-off-by: Yash Singh <yash.singh@samsung.com>
nntrainer/layers/cl_layers/addition_layer_cl.cpp
nntrainer/layers/cl_layers/addition_layer_cl.h
nntrainer/tensor/cl_operations/blas_kernel_interface.cpp
nntrainer/tensor/cl_operations/blas_kernel_interface.h
test/unittest/layers/unittest_layers_addition_cl.cpp

index 7cb9a310683d688eb322fbd77d0eae38ec724c65..dda210164563bc7f98c648dd36517205422b293b 100644 (file)
@@ -12,7 +12,7 @@
  */
 
 #include <addition_layer_cl.h>
-#include <blas_kernels.h>
+#include <blas_kernel_interface.h>
 #include <nntrainer_error.h>
 #include <nntrainer_log.h>
 #include <node_exporter.h>
@@ -37,47 +37,11 @@ void AdditionLayerCL::forwarding(RunLayerContext &context, bool training) {
     if (!idx) {
       hidden_.copy(input_);
     } else {
-      AddProcess(input_, hidden_, context);
+      add_i_cl(input_, hidden_, context);
     }
   }
 }
 
-void AdditionLayerCL::AddProcess(Tensor const &input, Tensor &result,
-                                 RunLayerContext &context) {
-
-  CREATE_IF_EMPTY_DIMS(result, result.getDim());
-
-  NNTR_THROW_IF(result.getData() == nullptr, std::invalid_argument)
-    << result.getName() << " is not allocated";
-  NNTR_THROW_IF(input.getData() == nullptr, std::invalid_argument)
-    << input.getName() << " is not allocated";
-
-  if (input.getDim() != result.getDim()) {
-    throw std::invalid_argument(
-      "Error: Dimensions does not match for addition");
-  }
-
-  if (input.getDataType() == ml::train::TensorDim::DataType::FP32) {
-    unsigned int size = input.size();
-    const float *data = input.getData();
-    float *rdata = result.getData();
-
-    addition_cl(data, rdata, size, context);
-
-  } else if (input.getDataType() == ml::train::TensorDim::DataType::FP16) {
-#ifdef ENABLE_FP16
-    unsigned int size = input.size();
-    const _FP16 *data = input.getData<_FP16>();
-    _FP16 *rdata = result.getData<_FP16>();
-
-    addition_cl(data, rdata, size, context);
-
-#else
-    throw std::invalid_argument("Error: enable-fp16 is not enabled");
-#endif
-  }
-}
-
 void AdditionLayerCL::incremental_forwarding(RunLayerContext &context,
                                              unsigned int from, unsigned int to,
                                              bool training) {
@@ -113,7 +77,7 @@ void AdditionLayerCL::incremental_forwarding(RunLayerContext &context,
       if (!idx) {
         hidden_step.copy(input_step);
       } else {
-        AddProcess(input_step, hidden_step, context);
+        add_i_cl(input_step, hidden_step, context);
       }
     }
   }
index b556746a7c920b0e928d401d57d27fc3127a2830..e24354e8d0560d1b25f565d19e8d3bb635bf2257 100644 (file)
@@ -76,15 +76,6 @@ public:
    */
   void calcDerivative(RunLayerContext &context) override;
 
-  /**
-   * @brief Process data and dimensions for add operation used in addition layer
-   * @param[in] input Tensor
-   * @param[in] result Tensor
-   * @param[in] RunLayerContext reference
-   */
-  void AddProcess(Tensor const &input, Tensor &result,
-                  RunLayerContext &context);
-
   /**
    * @copydoc bool supportBackwarding() const
    */
index c0c98019d5cff27994fe011270f5a65bab82bb91..9abeca9b781d6d15e167fa2a7c03f65a63462508 100644 (file)
@@ -211,4 +211,39 @@ void multiplyCl(Tensor &input, float const &value, RunLayerContext &context) {
   }
 }
 
+void add_i_cl(Tensor const &input, Tensor &result, RunLayerContext &context) {
+
+  CREATE_IF_EMPTY_DIMS(result, result.getDim());
+
+  NNTR_THROW_IF(result.getData() == nullptr, std::invalid_argument)
+    << result.getName() << " is not allocated";
+  NNTR_THROW_IF(input.getData() == nullptr, std::invalid_argument)
+    << input.getName() << " is not allocated";
+
+  if (input.getDim() != result.getDim()) {
+    throw std::invalid_argument(
+      "Error: Dimensions does not match for addition");
+  }
+
+  if (input.getDataType() == ml::train::TensorDim::DataType::FP32) {
+    unsigned int size = input.size();
+    const float *data = input.getData();
+    float *rdata = result.getData();
+
+    addition_cl(data, rdata, size, context);
+
+  } else if (input.getDataType() == ml::train::TensorDim::DataType::FP16) {
+#ifdef ENABLE_FP16
+    unsigned int size = input.size();
+    const _FP16 *data = input.getData<_FP16>();
+    _FP16 *rdata = result.getData<_FP16>();
+
+    addition_cl(data, rdata, size, context);
+
+#else
+    throw std::invalid_argument("Error: enable-fp16 is not enabled");
+#endif
+  }
+}
+
 } // namespace nntrainer
index 91b66b0cf8d551a74a41136eee6a3a4792d86577..97a47da3e30980c93208dcb55c608d5b93a8d377 100644 (file)
@@ -63,5 +63,13 @@ void dotBatchedCl(Tensor const &input, Tensor const &m, Tensor &result,
  */
 void multiplyCl(Tensor &input, float const &value, RunLayerContext &context);
 
+/**
+ * @brief Process data and dimensions for add operation
+ * @param[in] input Tensor
+ * @param[in] result Tensor
+ * @param[in] RunLayerContext reference
+ */
+void add_i_cl(Tensor const &input, Tensor &result, RunLayerContext &context);
+
 } // namespace nntrainer
 #endif /* __BLAS_KERNEL_INTERFACE_H__ */
index 113e7fd690e86466381304acf3f5c1150323a223..2a3d86119d7e86593cd1ef32459b213b2a167184 100644 (file)
@@ -51,6 +51,6 @@ auto addition_w16a16_gpu = LayerGoldenTestParamType(
   "added_w16a16.nnlayergolden", LayerGoldenTestParamOptions::DEFAULT, "nchw",
   "fp16", "fp16");
 
-GTEST_PARAMETER_TEST(Addition16, LayerGoldenTest,
+GTEST_PARAMETER_TEST(AdditionGPU16, LayerGoldenTest,
                      ::testing::Values(addition_w16a16_gpu));
 #endif