From: "Jeffrey R. Carter" <spam.jrcarter.not@spam.not.acm.org>
Subject: Re: GNAT can't vectorize Real_Matrix multiplication from Ada.Numerics.Real_Arrays. What a surprise!
Date: Sun, 18 Feb 2018 11:35:50 +0100
Date: 2018-02-18T11:35:50+01:00 [thread overview]
Message-ID: <p6bku6$s7j$1@dont-email.me> (raw)
In-Reply-To: <a7b3cac4-b108-4941-a498-25d402b3b409@googlegroups.com>
On 02/18/2018 02:51 AM, Bojan Bozovic wrote:
>
> Apart from response that they don't offer support on GPL versions of compiler, I got no response. I hope this will be useful to someone.
Nor should you expect anything to happen, since you have not found an error. An
error is when the compiler accepts illegal code, rejects legal code, or produces
object code that gives incorrect results. At best you have found an opportunity
for better optimization. Even that seems unlikely.
Remember that Ada.Numerics.Real_Arrays."*" is a general-purpose library
function. As such, it has to do things that your specific implementation of
matrix multiplication doesn't: It has to check that Left'Length (2) =
Right'Length (1) and raise an exception if they're not equal. Your code doesn't,
and any such check should be optimized away because its condition will be
statically False. The general code has to handle the case where Left'First (2)
/= Right'First (1). Even when the offset is zero, that's still an extra addition
in the inner loop.
Also, Ada.Numerics.Real_Arrays is provided precompiled, and is surely compiled
with different optimization options than your code. (IIRC, -O3 is considered
experimental, and AdaCore is not going to compile its library code with
experimental optimization.)
You can find GNAT's implementation of matrix multiplication as
System.Generic_Array_Operations.Matrix_Matrix_Product. This is extremely
general, allowing for non-numeric matrix components (complex numbers, for
example), and different component types for the left, right, and result
matrices. This may introduce additional barriers to optimization.
Since Ada.Numerics.Real_Arrays is an instantiation of
Ada.Numerics.Generic_Real_Arrays for Float, and GNAT does macro expansion of
generics, if you use an explicit instantiation of
Ada.Numerics.Generic_Real_Arrays in your code, it should be compiled with your
compiler options and thus remove that variable from your comparison. Doing that
in your code, and building with
gnatmake -O3 -mavx2 matrix_mul -largs -s
cuts the reported time for "*" by a factor of about 4. Not surprisingly, still
slower. YMMV
--
Jeff Carter
Just as Khan was hindered by two-dimensional thinking in a
three-dimensional situation, so many developers are hindered
by sequential thinking in concurrent situations.
118
next prev parent reply other threads:[~2018-02-18 10:35 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-02-17 12:55 GNAT can't vectorize Real_Matrix multiplication from Ada.Numerics.Real_Arrays. What a surprise! Bojan Bozovic
2018-02-17 15:17 ` Bojan Bozovic
2018-02-17 15:49 ` Bojan Bozovic
2018-02-18 1:51 ` Bojan Bozovic
2018-02-18 10:35 ` Jeffrey R. Carter [this message]
2018-02-18 12:05 ` Bojan Bozovic
2018-02-18 13:31 ` Jeffrey R. Carter
2018-02-18 19:38 ` Bojan Bozovic
2018-02-18 21:48 ` Nasser M. Abbasi
2018-02-18 22:50 ` Bojan Bozovic
2018-02-19 21:08 ` Robert Eachus
2018-02-20 2:31 ` Bojan Bozovic
2018-02-26 6:58 ` Robert Eachus
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox