[ Tensor ] Implement add_i_partial
authorskykongkong8 <ss.kong@samsung.com>
Tue, 18 Jun 2024 00:50:34 +0000 (09:50 +0900)
committerJijoong Moon <jijoong.moon@samsung.com>
Thu, 20 Jun 2024 01:44:21 +0000 (10:44 +0900)
- Occasionally, add_i computation for only interested section is desired.
- Moreover, this function could lower down if/def code blocks from the layer level.

**Self evaluation:**
1. Build test:     [X]Passed [ ]Failed [ ]Skipped
2. Run test:     [X]Passed [ ]Failed [ ]Skipped

Signed-off-by: skykongkong8 <ss.kong@samsung.com>
nntrainer/tensor/tensor.cpp
nntrainer/tensor/tensor.h

index 5dc3c93f01fe5abaa811712ff1bd4f7acfa63b3f..5a583c69e2b2d919467c82b03590efca1d94ea5e 100644 (file)
@@ -1005,6 +1005,24 @@ int Tensor::add_i(Tensor const &m, float const alpha) {
   return ML_ERROR_NONE;
 }
 
+int Tensor::add_i_partial(unsigned int len, unsigned int addr_idx, Tensor &m,
+                          unsigned int incX, unsigned int incY,
+                          const Tensor alphas, unsigned int alpha_idx) {
+  if (dim.getDataType() == ml::train::TensorDim::DataType::FP32) {
+    saxpy(len, alphas.getValue<float>(alpha_idx), m.getData<float>(), incX, getAddress<float>(addr_idx),
+          incY);
+  } else if (dim.getDataType() == ml::train::TensorDim::DataType::FP16) {
+#ifdef ENABLE_FP16
+    saxpy(len, alphas.getValue<_FP16>(alpha_idx), m.getData<_FP16>(), incX, getAddress<_FP16>(addr_idx),
+          incY);
+#else
+    ml_loge("%s", "Error: enable-fp16 is not enabled");
+    return ML_ERROR_INVALID_PARAMETER;
+#endif
+  }
+  return ML_ERROR_NONE;
+}
+
 Tensor Tensor::add(Tensor const &m, float const alpha) const {
   Tensor t;
   return this->add(m, t, alpha);
index 211334da40e208a675e28767cf2d734ef6e51e9f..df484da79a191c2b89d91dbf3b6a9f7cbaba7e37 100644 (file)
@@ -865,7 +865,19 @@ public:
    * @retval #ML_ERROR_NONE  Successful
    * @retval #ML_ERROR_INVALID_PARAMETER Invalid Parameter
    */
-  int add_i(Tensor const &m, float const alpha = 1);
+  int add_i(Tensor const &m, float const alpha = 1.F);
+
+  /**
+   * @brief Do add_i for specific section
+   *
+   * @param len Length of the specific section
+   * @param addr_idx Starting index of the psecific section
+   * @param m Input Tensor to be added
+   * @param alpha Scale factor
+   */
+  int add_i_partial(unsigned int len, unsigned int addr_idx, Tensor &m,
+                    unsigned int incX, unsigned int incY,
+                    const Tensor alphas, unsigned int alpha_idx);
 
   /**
    * @brief     Add Tensor Element by Element