The order of the loops defines the data reused in the BLIS implementation of
authorRoman Gareev <gareevroman@gmail.com>
Thu, 15 Dec 2016 11:47:38 +0000 (11:47 +0000)
committerRoman Gareev <gareevroman@gmail.com>
Thu, 15 Dec 2016 11:47:38 +0000 (11:47 +0000)
commit8babe1a21609933d149a61bd5ff43c26251d8590
treee322993fbbed4670a26ce7e127f2eccd598dfabf
parent552c8e960e9e88d3c96a467df2e37efa27eff7d2
The order of the loops defines the data reused in the BLIS implementation of
gemm ([1]). In particular, elements of the matrix B, the second operand of
matrix multiplication, are reused between iterations of the innermost loop.
To keep the reused data in cache, only elements of matrix A, the first operand
of matrix multiplication, should be evicted during an iteration of the
innermost loop. To provide such a cache replacement policy, elements of the
matrix A can, in particular, be loaded first and, consequently, be
least-recently-used.

In our case matrices are stored in row-major order instead of column-major
order used in the BLIS implementation ([1]). One of the ways to address it is
to accordingly change the order of the loops of the loop nest. However, it
makes elements of the matrix A to be reused in the innermost loop and,
consequently, requires to load elements of the matrix B first. Since the LLVM
vectorizer always generates loads from the matrix A before loads from the
matrix B and we can not provide it. Consequently, we only change the BLIS micro
kernel and the computation of its parameters instead. In particular, reused
elements of the matrix B are successively multiplied by specific elements of
the matrix A .

Refs.:
[1] - http://www.cs.utexas.edu/users/flame/pubs/TOMS-BLIS-Analytical.pdf

Reviewed-by: Tobias Grosser <tobias@grosser.es>
Differential Revision: https://reviews.llvm.org/D25653

llvm-svn: 289806
polly/include/polly/ScheduleOptimizer.h
polly/lib/Transform/ScheduleOptimizer.cpp
polly/test/ScheduleOptimizer/mat_mul_pattern_data_layout.ll
polly/test/ScheduleOptimizer/pattern-matching-based-opts_3.ll