re PR libfortran/51119 (MATMUL slow for large matrices)
authorThomas Koenig <tkoenig@gcc.gnu.org>
Sun, 26 Feb 2017 13:22:43 +0000 (13:22 +0000)
committerThomas Koenig <tkoenig@gcc.gnu.org>
Sun, 26 Feb 2017 13:22:43 +0000 (13:22 +0000)
2017-02-26  Thomas Koenig  <tkoenig@gcc.gnu.org>

PR fortran/51119
* options.c (gfc_post_options): Set default limit for matmul
inlining to 30.
* invoke.texi: Document change.

2017-02-26  Thomas Koenig  <tkoenig@gcc.gnu.org>

PR fortran/51119
* gfortran.dg/inline_matmul_1.f90: Scan optimized dump instead
of original.
* gfortran.dg/inline_matmul_11.f90: Likewise.
* gfortran.dg/inline_matmul_9.f90: Likewise.
* gfortran.dg/matmul_13.f90: New test.
* gfortran.dg/matmul_14.f90: New test.

From-SVN: r245745

gcc/fortran/ChangeLog
gcc/fortran/invoke.texi
gcc/fortran/options.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/inline_matmul_1.f90
gcc/testsuite/gfortran.dg/inline_matmul_11.f90
gcc/testsuite/gfortran.dg/inline_matmul_9.f90
gcc/testsuite/gfortran.dg/matmul_13.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/matmul_14.f90 [new file with mode: 0644]

index 6ee1474..e3af1c5 100644 (file)
@@ -1,3 +1,10 @@
+2017-02-26  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       PR fortran/51119
+       * options.c (gfc_post_options): Set default limit for matmul
+       inlining to 30.
+       * invoke.texi: Document change.
+
 2017-02-25  Dominique d'Humieres  <dominiq@lps.ens.fr>
 
        PR fortran/79601
index 2a89647..636432f 100644 (file)
@@ -1629,9 +1629,8 @@ for matrices with size up to @var{n}. If the matrices involved are not
 square, the size comparison is performed using the geometric mean of
 the dimensions of the argument and result matrices.
 
-The default value for @var{n} is the value specified for
-@code{-fblas-matmul-limit} if this option is specified, or unlimitited
-otherwise.
+The default value for @var{n} is 30.  The @code{-fblas-matmul-limit}
+can be used to change this value.
 
 @item -frecursive
 @opindex @code{frecursive}
index dc8df5b..1af76aa 100644 (file)
@@ -388,10 +388,16 @@ gfc_post_options (const char **pfilename)
   if (!flag_automatic)
     flag_max_stack_var_size = 0;
   
-  /* If we call BLAS directly, only inline up to the BLAS limit.  */
+  /* If the user did not specify an inline matmul limit, inline up to the BLAS
+     limit or up to 30 if no external BLAS is specified.  */
 
-  if (flag_external_blas && flag_inline_matmul_limit < 0)
-    flag_inline_matmul_limit = flag_blas_matmul_limit;
+  if (flag_inline_matmul_limit < 0)
+    {
+      if (flag_external_blas)
+       flag_inline_matmul_limit = flag_blas_matmul_limit;
+      else
+       flag_inline_matmul_limit = 30;
+    }
 
   /* Optimization implies front end optimization, unless the user
      specified it directly.  */
index e2850e8..30198a6 100644 (file)
@@ -1,3 +1,13 @@
+2017-02-26  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       PR fortran/51119
+       * gfortran.dg/inline_matmul_1.f90: Scan optimized dump instead
+       of original.
+       * gfortran.dg/inline_matmul_11.f90: Likewise.
+       * gfortran.dg/inline_matmul_9.f90: Likewise.
+       * gfortran.dg/matmul_13.f90: New test.
+       * gfortran.dg/matmul_14.f90: New test.
+
 2017-02-25  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/79396
index 266aad0..c3177d7 100644 (file)
@@ -1,5 +1,5 @@
 ! { dg-do  run }
-! { dg-options "-ffrontend-optimize -fdump-tree-original -Wrealloc-lhs" }
+! { dg-options "-ffrontend-optimize -fdump-tree-optimized -Wrealloc-lhs" }
 ! PR 37131 - check basic functionality of inlined matmul, making
 ! sure that the library is not called, with and without reallocation.
 
@@ -149,4 +149,4 @@ program main
 
 end program main
 
-! { dg-final { scan-tree-dump-times "_gfortran_matmul" 0 "original" } }
+! { dg-final { scan-tree-dump-times "_gfortran_matmul" 0 "optimized" } }
index 783c83c..016d8d7 100644 (file)
@@ -1,5 +1,5 @@
 ! { dg-do  run }
-! { dg-additional-options "-ffrontend-optimize -fdump-tree-original" }
+! { dg-additional-options "-ffrontend-optimize -fdump-tree-optimized" }
 ! PR fortran/66176 - inline conjg for matml.
 program main
   complex, dimension(3,2) :: a
@@ -29,4 +29,4 @@ program main
   c = matmul(conjg(a), b)
   if (any(conjg(c) /= res2)) call abort
 end program main
-! { dg-final { scan-tree-dump-times "_gfortran_matmul" 0 "original" } }
+! { dg-final { scan-tree-dump-times "_gfortran_matmul" 0 "optimized" } }
index 67b9fca..901cd96 100644 (file)
@@ -1,5 +1,5 @@
 ! { dg-do  run }
-! { dg-options "-ffrontend-optimize -fdump-tree-original" }
+! { dg-options "-ffrontend-optimize -fdump-tree-optimized" }
 ! PR 66041 - this used to ICE with an incomplete fix for the PR.
 program main
   implicit none
@@ -21,4 +21,4 @@ program main
   if (any (c2-reshape([248., -749.],shape(c2)) /= 0.)) call abort
 end program main
 
-! { dg-final { scan-tree-dump-times "_gfortran_matmul" 0 "original" } }
+! { dg-final { scan-tree-dump-times "_gfortran_matmul" 0 "optimized" } }
diff --git a/gcc/testsuite/gfortran.dg/matmul_13.f90 b/gcc/testsuite/gfortran.dg/matmul_13.f90
new file mode 100644 (file)
index 0000000..3262d1a
--- /dev/null
@@ -0,0 +1,12 @@
+! { dg-do compile }
+! { dg-options "-O3 -fdump-tree-optimized" }
+! Check that the default limit of 30 for inlining matmul applies.
+program main
+  integer, parameter :: n = 31
+  real, dimension(n,n) :: a, b, c
+  call random_number(a)
+  call random_number(b)
+  c = matmul(a,b)
+  print *,sum(c)
+end program main
+! { dg-final { scan-tree-dump-times "_gfortran_matmul_r4" 1 "optimized" } }
diff --git a/gcc/testsuite/gfortran.dg/matmul_14.f90 b/gcc/testsuite/gfortran.dg/matmul_14.f90
new file mode 100644 (file)
index 0000000..5c2b3f2
--- /dev/null
@@ -0,0 +1,12 @@
+! { dg-do compile }
+! { dg-options "-O3 -fdump-tree-optimized" }
+! Check that the default limit of 30 for inlining matmul applies.
+program main
+  integer, parameter :: n = 30
+  real, dimension(n,n) :: a, b, c
+  call random_number(a)
+  call random_number(b)
+  c = matmul(a,b)
+  print *,sum(c)
+end program main
+! { dg-final { scan-tree-dump-times "_gfortran_matmul_r4" 0 "optimized" } }