[ hgemm ] Use aligned memory allocation in transpose / padding gemm
authorskykongkong8 <ss.kong@samsung.com>
Thu, 20 Jun 2024 11:17:47 +0000 (20:17 +0900)
committerJijoong Moon <jijoong.moon@samsung.com>
Fri, 28 Jun 2024 04:48:47 +0000 (13:48 +0900)
- Using unaligned memory may invoke SIGSEGV

**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.cpp

index c8a31f216c4eb9127bc705d743cee52a7d00c2b0..2b48a630572755037e17eb7544854ae6f5e28516 100644 (file)
@@ -66,8 +66,9 @@ void hgemm_noTrans_strict(const __fp16 *A, const __fp16 *B, float *C32,
   }
 }
 
-void hgemm_noTrans_strict(const __fp16 *A, const __fp16 *B, __fp16 *C, unsigned int M,
-                   unsigned int N, unsigned int K, float alpha, float beta) {
+void hgemm_noTrans_strict(const __fp16 *A, const __fp16 *B, __fp16 *C,
+                          unsigned int M, unsigned int N, unsigned int K,
+                          float alpha, float beta) {
   if (alpha == 1.F) {
     // used bitwise operator instead of modulo for performance
     // e.g (M % 8) is same as (M & 0x7) which will extract last 3 bits of M
@@ -96,8 +97,8 @@ void hgemm_noTrans_padding_wrt_K(const __fp16 *A, const __fp16 *B, float *C,
   const unsigned int lda = K;
   const unsigned int ldb = N;
 
-  __fp16 *A8 = new __fp16[M * K8_high];
-  __fp16 *B8 = new __fp16[K8_high * N];
+  __fp16 *A8 = alignedMalloc(M * K8_high);
+  __fp16 *B8 = alignedMalloc(K8_high * N);
 
   float16x8_t ZEROS = vmovq_n_f16(0.F);
 
@@ -829,7 +830,7 @@ void hgemm_noTrans_8x16(unsigned int M, unsigned int N, unsigned int K,
                         const __fp16 *A, unsigned int lda, const __fp16 *B,
                         unsigned int ldb, __fp16 *C, unsigned int ldc,
                         float alpha, float beta) {
-// M, N, K is full M, N, K here
+  // M, N, K is full M, N, K here
 
   __fp16 *sA = alignedMalloc(M * K);
   __fp16 *sB = alignedMalloc(K * N);
@@ -1257,7 +1258,7 @@ void hgemm_noTrans_fallback(unsigned int M, unsigned int N, unsigned int K,
 
 void hgemm_transB(const __fp16 *A, const __fp16 *B, float *C, unsigned int M,
                   unsigned int N, unsigned int K, float alpha, float beta) {
-  __fp16 *B_T = new __fp16[K * N];
+  __fp16 *B_T = alignedMalloc(K * N);
 
   transpose_neon<__fp16>(N, K, B, K, B_T, N);
 
@@ -1268,7 +1269,7 @@ void hgemm_transB(const __fp16 *A, const __fp16 *B, float *C, unsigned int M,
 
 void hgemm_transA(const __fp16 *A, const __fp16 *B, float *C, unsigned int M,
                   unsigned int N, unsigned int K, float alpha, float beta) {
-  __fp16 *A_T = new __fp16[M * K];
+  __fp16 *A_T = alignedMalloc(M * K);
 
   transpose_neon<__fp16>(K, M, A, M, A_T, K);
 
@@ -1279,8 +1280,8 @@ void hgemm_transA(const __fp16 *A, const __fp16 *B, float *C, unsigned int M,
 
 void hgemm_transAB(const __fp16 *A, const __fp16 *B, float *C, unsigned int M,
                    unsigned int N, unsigned int K, float alpha, float beta) {
-  __fp16 *A_T = new __fp16[M * K];
-  __fp16 *B_T = new __fp16[K * N];
+  __fp16 *A_T = alignedMalloc(M * K);
+  __fp16 *B_T = alignedMalloc(K * N);
 
   transpose_neon<__fp16>(K, M, A, M, A_T, K);
   transpose_neon<__fp16>(N, K, B, K, B_T, N);