/*++ Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT License. Module Name: SgemmKernelpower.h Abstract: This module implements the kernels for the single precision matrix/matrix multiply operation (SGEMM). --*/ #include "FgemmKernelpower.h" template MLAS_FORCEINLINE size_t MlasSgemmProcessCount( const float* A, const float* B, float* C, size_t CountK, size_t CountN, size_t lda, size_t ldc, MLAS_FLOAT32X4 AlphaBroadcast, bool ZeroMode ) { do { const float* a = A; size_t k = CountK; MLAS_FLOAT32X4 Accumulators[RowCount][4]; MLAS_FLOAT32X4 AElements[RowCount]; MLAS_FLOAT32X4 ABroadcast[RowCount]; // // Clear the block accumulators. // MlasLoopUnroll()(Accumulators); // // Compute the output block. // while (k >= 4) { MlasLoopUnroll()(AElements, a, lda); MlasLoopUnroll>()(AElements, ABroadcast); MlasFgemmComputeBlock(Accumulators, ABroadcast, B); MlasLoopUnroll>()(AElements, ABroadcast); MlasFgemmComputeBlock(Accumulators, ABroadcast, B + 16); MlasLoopUnroll>()(AElements, ABroadcast); MlasFgemmComputeBlock(Accumulators, ABroadcast, B + 32); MlasLoopUnroll>()(AElements, ABroadcast); MlasFgemmComputeBlock(Accumulators, ABroadcast, B + 48); a += 4; B += 16 * 4; k -= 4; } while (k > 0) { MlasLoopUnroll()(ABroadcast, a, lda); MlasFgemmComputeBlock(Accumulators, ABroadcast, B); a += 1; B += 16; k -= 1; } if (CountN >= 16) { // // Store the entire output block. // MlasLoopUnroll>()(Accumulators, C, ldc, AlphaBroadcast, ZeroMode); } else { // // Store the partial output block. // if (CountN >= 12) { MlasLoopUnroll>()(Accumulators, C, ldc, AlphaBroadcast, ZeroMode); } else if (CountN >= 8) { MlasLoopUnroll>()(Accumulators, C, ldc, AlphaBroadcast, ZeroMode); } else if (CountN >= 4) { MlasLoopUnroll>()(Accumulators, C, ldc, AlphaBroadcast, ZeroMode); } // // Store the remaining unaligned columns. // C += (CountN & ~3); CountN &= 3; if (CountN > 0) { MlasLoopUnroll()(Accumulators, AlphaBroadcast); MlasLoopUnroll>()(Accumulators, C, ldc, ZeroMode); if (CountN >= 2) { MlasLoopUnroll>()(Accumulators, C, ldc, ZeroMode); } if (CountN >= 3) { MlasLoopUnroll>()(Accumulators, C, ldc, ZeroMode); } } break; } C += 16; CountN -= 16; } while (CountN > 0); return RowCount; }