[ hgemm ] Implement matrix noTrans A w.r.t. MK padding
authorskykongkong8 <ss.kong@samsung.com>
Fri, 12 Jul 2024 05:15:03 +0000 (14:15 +0900)
committerJijoong Moon <jijoong.moon@samsung.com>
Tue, 30 Jul 2024 22:45:30 +0000 (07:45 +0900)
**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/hgemm/hgemm_padding/hgemm_padding_a.cpp

index 99eab5c96819467428baebe4736ea93475b31c3c..297852719b0c0c0707f596fcef9ac95f40a9482b 100644 (file)
@@ -90,7 +90,25 @@ void hgemm_padding_A_noTrans_wrt_K(const __fp16 *A, __fp16 *Ap, unsigned int M,
 void hgemm_padding_A_noTrans_wrt_MK(const __fp16 *A, __fp16 *Ap, unsigned int M,
                                     unsigned int K, unsigned int M8,
                                     unsigned int K8) {
-  std::cerr << "Error : hgemm_padding_A_noTrans_wrt_MK NYI!\n";
+  const unsigned int K8_low = (K >> 3) << 3;
+  float16x8_t ZEROS = vmovq_n_f16(0.F);
+
+  for (unsigned int m = 0; m < M; ++m) {
+    for (unsigned int k = 0; k < K8_low; ++k) {
+      vst1q_f16(&Ap[m * K8 + k], vld1q_f16(&A[m * K + k]));
+    }
+    for (unsigned int k = K8_low; k < K; ++k) {
+      Ap[m * K8 + k] = A[m * K + k];
+    }
+    for (unsigned int k = K; k < K8; ++k) {
+      Ap[m * K8 + k] = 0.F;
+    }
+  }
+  for (unsigned int m = M; m < M8; ++m) {
+    for (unsigned int k = K; k < K8; ++k) {
+      Ap[m * K8 + k] = ZEROS;
+    }
+  }
 }
 
 void hgemm_padding_A_Trans_wrt_M(const __fp16 *A, __fp16 *Ap, unsigned int M,