<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Approximatrix Forums — Matrix Multiply Speed Test]]></title>
	<link rel="self" href="https://forums.approximatrix.com/extern.php?action=feed&amp;tid=684&amp;type=atom" />
	<updated>2018-08-17T11:38:46Z</updated>
	<generator>PunBB</generator>
	<id>https://forums.approximatrix.com/viewtopic.php?id=684</id>
		<entry>
			<title type="html"><![CDATA[Re: Matrix Multiply Speed Test]]></title>
			<link rel="alternate" href="https://forums.approximatrix.com/viewtopic.php?pid=3158#p3158" />
			<content type="html"><![CDATA[<p>Frank,</p><p>Thank you for the interesting program!&nbsp; I&#039;ll have to try it myself.&nbsp; Our runtime library that is currently included is not particularly optimized to ensure portability, though we&#039;re looking at changing that.</p><p>You might get an additional speed boost by specifying the compiler flag </p><div class="codebox"><pre><code>-fexternal-blas</code></pre></div><p> and enabling LAPACK and BLAS in Project Options.&nbsp; However, I&#039;m not sure the gains would be particularly great.</p>]]></content>
			<author>
				<name><![CDATA[jeff]]></name>
				<uri>https://forums.approximatrix.com/profile.php?id=2</uri>
			</author>
			<updated>2018-08-17T11:38:46Z</updated>
			<id>https://forums.approximatrix.com/viewtopic.php?pid=3158#p3158</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Matrix Multiply Speed Test]]></title>
			<link rel="alternate" href="https://forums.approximatrix.com/viewtopic.php?pid=3155#p3155" />
			<content type="html"><![CDATA[<p>Jeff,<br />This is an informative message regarding 2D-matrix multiplication speed using various approaches.<br />I was a little surprised at the difference in speed between MatMMult and MatNMult routines, and how slow INTRINSIC DOT_PRODUCT appears to be compared to INTRINSIC MATMUL procedure.</p><p>I&#039;ve attached the SF Speed Test Program in the hope that it may be informative for other users of SF.</p><p>Frank</p><p>&nbsp; &nbsp; &nbsp; &nbsp; !--- TEST SPEED OF 2-D MATRIX MULTIPLICATION<br />&nbsp; &nbsp; &nbsp; &nbsp; !<br />&nbsp; &nbsp; &nbsp; &nbsp; !--- TEST RESULTS (DELL 64-BIT WINDOWS 7)<br />&nbsp; &nbsp; &nbsp; &nbsp; !----------------------------------------<br />&nbsp; &nbsp; &nbsp; &nbsp; !&nbsp; &nbsp; MMult<br />&nbsp; &nbsp; &nbsp; &nbsp; !&nbsp; &nbsp; D(:,:) = MATMUL(A,B)<br />&nbsp; &nbsp; &nbsp; &nbsp; !&nbsp; &nbsp; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br />&nbsp; &nbsp; &nbsp; &nbsp; !&nbsp; &nbsp; start time:&nbsp; 0.00000000<br />&nbsp; &nbsp; &nbsp; &nbsp; !&nbsp; &nbsp; A[ 4096,&nbsp; &nbsp;16 ]<br />&nbsp; &nbsp; &nbsp; &nbsp; !&nbsp; &nbsp; B[&nbsp; &nbsp;16, 4096 ]<br />&nbsp; &nbsp; &nbsp; &nbsp; !&nbsp; &nbsp; finish time:&nbsp; 1.76281000<br />&nbsp; &nbsp; &nbsp; &nbsp; !&nbsp; &nbsp; Run time =&nbsp; &nbsp;0.35256200 seconds.<br />&nbsp; &nbsp; &nbsp; &nbsp; !&nbsp; &nbsp; Relative run time:&nbsp; 1.00000000<br />&nbsp; &nbsp; &nbsp; &nbsp; !<br />&nbsp; &nbsp; &nbsp; &nbsp; !&nbsp; &nbsp; MatMMult<br />&nbsp; &nbsp; &nbsp; &nbsp; !&nbsp; &nbsp; D(1:M,I) = D(1:M,I) + A(1:M,J)*B(J,I)<br />&nbsp; &nbsp; &nbsp; &nbsp; !&nbsp; &nbsp; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br />&nbsp; &nbsp; &nbsp; &nbsp; !&nbsp; &nbsp; start time:&nbsp; 1.76281000<br />&nbsp; &nbsp; &nbsp; &nbsp; !&nbsp; &nbsp; finish time:&nbsp; 5.05443200<br />&nbsp; &nbsp; &nbsp; &nbsp; !&nbsp; &nbsp; Run time =&nbsp; &nbsp;0.65832440 seconds.<br />&nbsp; &nbsp; &nbsp; &nbsp; !&nbsp; &nbsp; Relative run time:&nbsp; 1.86725852<br />&nbsp; &nbsp; &nbsp; &nbsp; !<br />&nbsp; &nbsp; &nbsp; &nbsp; !&nbsp; &nbsp; MatDOTMult ( USES DOT_PRODUCT )<br />&nbsp; &nbsp; &nbsp; &nbsp; !&nbsp; &nbsp; D(I,J) = DOT_PRODUCT(A(I,1:N),B(1:N,J))<br />&nbsp; &nbsp; &nbsp; &nbsp; !&nbsp; &nbsp; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br />&nbsp; &nbsp; &nbsp; &nbsp; !&nbsp; &nbsp; start time:&nbsp; 5.05443200<br />&nbsp; &nbsp; &nbsp; &nbsp; !&nbsp; &nbsp; finish time: 10.71726800<br />&nbsp; &nbsp; &nbsp; &nbsp; !&nbsp; &nbsp; Run time =&nbsp; &nbsp;1.13256720 seconds.<br />&nbsp; &nbsp; &nbsp; &nbsp; !&nbsp; &nbsp; Relative run time:&nbsp; 3.21239158<br />&nbsp; &nbsp; &nbsp; &nbsp; !<br />&nbsp; &nbsp; &nbsp; &nbsp; !&nbsp; &nbsp; MatMult<br />&nbsp; &nbsp; &nbsp; &nbsp; !&nbsp; &nbsp; D(I,J) = D(I,J) + A(I,K)*B(K,J)<br />&nbsp; &nbsp; &nbsp; &nbsp; !&nbsp; &nbsp; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br />&nbsp; &nbsp; &nbsp; &nbsp; !&nbsp; &nbsp; start time: 10.71726800<br />&nbsp; &nbsp; &nbsp; &nbsp; !&nbsp; &nbsp; finish time: 33.75861500<br />&nbsp; &nbsp; &nbsp; &nbsp; !&nbsp; &nbsp; Run time =&nbsp; &nbsp;4.60826940 seconds.<br />&nbsp; &nbsp; &nbsp; &nbsp; !&nbsp; &nbsp; Relative run time: 13.07080570<br />&nbsp; &nbsp; &nbsp; &nbsp; !<br />&nbsp; &nbsp; &nbsp; &nbsp; !&nbsp; &nbsp; MatNMult<br />&nbsp; &nbsp; &nbsp; &nbsp; !&nbsp; &nbsp; D(I,1:M) = D(I,1:M) + A(I,J)*B(J,1:M)<br />&nbsp; &nbsp; &nbsp; &nbsp; !&nbsp; &nbsp; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br />&nbsp; &nbsp; &nbsp; &nbsp; !&nbsp; &nbsp; start time: 33.75861500<br />&nbsp; &nbsp; &nbsp; &nbsp; !&nbsp; &nbsp; finish time: 65.45801800<br />&nbsp; &nbsp; &nbsp; &nbsp; !&nbsp; &nbsp; Run time =&nbsp; &nbsp;6.33988060 seconds.<br />&nbsp; &nbsp; &nbsp; &nbsp; !&nbsp; &nbsp; Relative run time: 17.98231403<br />&nbsp; &nbsp; &nbsp; &nbsp; !<br />&nbsp; &nbsp; &nbsp; &nbsp; PROGRAM MAIN</p><p>&nbsp; &nbsp; &nbsp; &nbsp; IMPLICIT NONE</p><p>&nbsp; &nbsp; &nbsp; &nbsp; INTEGER*4 :: I, J, K<br />&nbsp; &nbsp; &nbsp; &nbsp; INTEGER*4 :: N, NR, NC, ND<br />&nbsp; &nbsp; &nbsp; &nbsp; REAL*8 :: A, B, C, D, E<br />&nbsp; &nbsp; &nbsp; &nbsp; REAL*8 :: START, FINISH, BEST, R</p><p>&nbsp; &nbsp; &nbsp; &nbsp; ALLOCATABLE A(:,:), B(:,:)<br />&nbsp; &nbsp; &nbsp; &nbsp; ALLOCATABLE C(:,:), D(:,:)<br />&nbsp; &nbsp; &nbsp; &nbsp; ALLOCATABLE E(:,:)</p><p>&nbsp; &nbsp; &nbsp; &nbsp; !--- RANDOM INPUT MATRIX ROWS AND COLUMNS<br />&nbsp; &nbsp; &nbsp; &nbsp; !--- 4096 X&nbsp; 16 = 65536<br />&nbsp; &nbsp; &nbsp; &nbsp; !---&nbsp; 256 X 256 = 65536<br />&nbsp; &nbsp; &nbsp; &nbsp; NR = 4096&nbsp; &nbsp; !256&nbsp; &nbsp; &nbsp;! NUMBER OF ROWS<br />&nbsp; &nbsp; &nbsp; &nbsp; NC = 16&nbsp; &nbsp; &nbsp; !256&nbsp; &nbsp; &nbsp;! NUMBER OF COLUMNS<br />&nbsp; &nbsp; &nbsp; &nbsp; ND = 1&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;! START OF INPUT ARRAY<br />&nbsp; &nbsp; &nbsp; &nbsp; N = 5&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ! NUMBER OF CYCLES</p><p>&nbsp; &nbsp; &nbsp; &nbsp; !--- DEFINE ARRAYS<br />&nbsp; &nbsp; &nbsp; &nbsp; ALLOCATE ( A(NR,NC), C(NR,NC) )<br />&nbsp; &nbsp; &nbsp; &nbsp; ALLOCATE ( B(NC,NR), D(NC,NR) )<br />&nbsp; &nbsp; &nbsp; &nbsp; ALLOCATE ( E(NR,NR) )</p><p>&nbsp; &nbsp; &nbsp; &nbsp; !--- RANDOMIZE INITIAL 2-D MATRICES A AND B<br />&nbsp; &nbsp; &nbsp; &nbsp; CALL cpu_time(R)<br />&nbsp; &nbsp; &nbsp; &nbsp; K = 0&nbsp; &nbsp;!INT( 10000.D0 * R )<br />&nbsp; &nbsp; &nbsp; &nbsp; A(:,:) = 1.D0<br />&nbsp; &nbsp; &nbsp; &nbsp; B(:,:) = 1.D0<br />&nbsp; &nbsp; &nbsp; &nbsp; DO I = 1, NR<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DO J = 1, NC<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; A(I,J) = A(I,J)&nbsp; * 1.4423D-01*(RAND(K) - 0.5D0)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; B(J,I) = B(J,I)&nbsp; * 2.4423D-01*(RAND(K) - 0.5D0)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; END DO<br />&nbsp; &nbsp; &nbsp; &nbsp; END DO</p><p>&nbsp; &nbsp; &nbsp; &nbsp; !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br />&nbsp; &nbsp; &nbsp; &nbsp; !--- MMULT( A, B )<br />&nbsp; &nbsp; &nbsp; &nbsp; WRITE(*,&#039;(1X,A)&#039;) &#039;MMult&#039;<br />&nbsp; &nbsp; &nbsp; &nbsp; WRITE(*,*) REPEAT(&#039;~&#039;,30)<br />&nbsp; &nbsp; &nbsp; &nbsp; !--- COPY INITIAL MATRIX A[ , ]<br />&nbsp; &nbsp; &nbsp; &nbsp; C(:,:) = A(:,:)<br />&nbsp; &nbsp; &nbsp; &nbsp; !--- COPY INITIAL MATRIX B[ , ]<br />&nbsp; &nbsp; &nbsp; &nbsp; D(:,:) = B(:,:)<br />&nbsp; &nbsp; &nbsp; &nbsp; call cpu_time(START)<br />&nbsp; &nbsp; &nbsp; &nbsp; WRITE(*,&#039;(1X,A,F12.8)&#039;) &#039;start time:&#039;, START<br />&nbsp; &nbsp; &nbsp; &nbsp; DO K = 1, N<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; !--- INTRINSIC MATRIX MULTIPLY<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CALL MMult(C,D,NR,NC,E)<br />&nbsp; &nbsp; &nbsp; &nbsp; END DO<br />&nbsp; &nbsp; &nbsp; &nbsp; call cpu_time(FINISH)<br />&nbsp; &nbsp; &nbsp; &nbsp; WRITE(*,&#039;(1X,A2,I5,A1,I5,A2)&#039;) &#039;A[&#039;,SIZE(A,1),&#039;,&#039;,SIZE(A,2),&#039; ]&#039;<br />&nbsp; &nbsp; &nbsp; &nbsp; WRITE(*,&#039;(1X,A2,I5,A1,I5,A2)&#039;) &#039;B[&#039;,SIZE(B,1),&#039;,&#039;,SIZE(B,2),&#039; ]&#039;<br />&nbsp; &nbsp; &nbsp; &nbsp; WRITE(*,&#039;(1X,A,F12.8)&#039;) &#039;finish time:&#039;, FINISH<br />&nbsp; &nbsp; &nbsp; &nbsp; WRITE(*,&#039;(1X,A,F12.8,A)&#039;) &#039;Run time = &#039;, (finish-start)/N, &#039; seconds.&#039;<br />&nbsp; &nbsp; &nbsp; &nbsp; BEST = finish - start<br />&nbsp; &nbsp; &nbsp; &nbsp; WRITE(*,&#039;(1X,A18,F12.8/)&#039;) &#039;Relative run time:&#039;, (finish-start)/BEST</p><p>&nbsp; &nbsp; &nbsp; &nbsp; !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br />&nbsp; &nbsp; &nbsp; &nbsp; !--- MATMMULT( A, B )<br />&nbsp; &nbsp; &nbsp; &nbsp; WRITE(*,&#039;(1X,A)&#039;) &#039;MatMMult&#039;<br />&nbsp; &nbsp; &nbsp; &nbsp; WRITE(*,*) REPEAT(&#039;~&#039;,30)<br />&nbsp; &nbsp; &nbsp; &nbsp; !--- COPY INITIAL MATRIX A[ , ]<br />&nbsp; &nbsp; &nbsp; &nbsp; C(:,:) = A(:,:)<br />&nbsp; &nbsp; &nbsp; &nbsp; !--- COPY INITIAL MATRIX B[ , ]<br />&nbsp; &nbsp; &nbsp; &nbsp; D(:,:) = B(:,:)<br />&nbsp; &nbsp; &nbsp; &nbsp; call cpu_time(START)<br />&nbsp; &nbsp; &nbsp; &nbsp; WRITE(*,&#039;(1X,A,F12.8)&#039;) &#039;start time:&#039;, START<br />&nbsp; &nbsp; &nbsp; &nbsp; DO K = 1, N<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; !--- CODED MATRIX MULTIPLY<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; E(:,:) = 0.D0<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CALL MatMMult( C, D, NR, NC, E )<br />&nbsp; &nbsp; &nbsp; &nbsp; END DO<br />&nbsp; &nbsp; &nbsp; &nbsp; call cpu_time(FINISH)<br />&nbsp; &nbsp; &nbsp; &nbsp; WRITE(*,&#039;(1X,A,F12.8)&#039;) &#039;finish time:&#039;, FINISH<br />&nbsp; &nbsp; &nbsp; &nbsp; WRITE(*,&#039;(1X,A,F12.8,A)&#039;) &#039;Run time = &#039;, (finish-start)/N, &#039; seconds.&#039;<br />&nbsp; &nbsp; &nbsp; &nbsp; WRITE(*,&#039;(1X,A18,F12.8/)&#039;) &#039;Relative run time:&#039;, (finish-start)/BEST</p><p>&nbsp; &nbsp; &nbsp; &nbsp; !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br />&nbsp; &nbsp; &nbsp; &nbsp; !--- MATDOTMULT( A, B )<br />&nbsp; &nbsp; &nbsp; &nbsp; WRITE(*,&#039;(1X,A)&#039;) &#039;MatDOTMult&#039;<br />&nbsp; &nbsp; &nbsp; &nbsp; WRITE(*,*) REPEAT(&#039;~&#039;,30)</p><p>&nbsp; &nbsp; &nbsp; &nbsp; !--- COPY INITIAL MATRIX A[ , ]<br />&nbsp; &nbsp; &nbsp; &nbsp; C(:,:) = A(:,:)<br />&nbsp; &nbsp; &nbsp; &nbsp; !--- COPY INITIAL MATRIX B[ , ]<br />&nbsp; &nbsp; &nbsp; &nbsp; D(:,:) = B(:,:)<br />&nbsp; &nbsp; &nbsp; &nbsp; call cpu_time(START)<br />&nbsp; &nbsp; &nbsp; &nbsp; WRITE(*,&#039;(1X,A,F12.8)&#039;) &#039;start time:&#039;, START<br />&nbsp; &nbsp; &nbsp; &nbsp; DO K = 1, N<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; !--- CODED MATRIX MULTIPLY<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; E(:,:) = 0.D0<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CALL MatDotMult( C, D, NR, NC, E )<br />&nbsp; &nbsp; &nbsp; &nbsp; END DO<br />&nbsp; &nbsp; &nbsp; &nbsp; call cpu_time(FINISH)<br />&nbsp; &nbsp; &nbsp; &nbsp; WRITE(*,&#039;(1X,A,F12.8)&#039;) &#039;finish time:&#039;, FINISH<br />&nbsp; &nbsp; &nbsp; &nbsp; WRITE(*,&#039;(1X,A,F12.8,A)&#039;) &#039;Run time = &#039;, (finish-start)/N, &#039; seconds.&#039;<br />&nbsp; &nbsp; &nbsp; &nbsp; WRITE(*,&#039;(1X,A18,F12.8/)&#039;) &#039;Relative run time:&#039;, (finish-start)/BEST</p><p>&nbsp; &nbsp; &nbsp; &nbsp; !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br />&nbsp; &nbsp; &nbsp; &nbsp; !--- MATMULT( A, B )<br />&nbsp; &nbsp; &nbsp; &nbsp; WRITE(*,&#039;(1X,A)&#039;) &#039;MatMult&#039;<br />&nbsp; &nbsp; &nbsp; &nbsp; WRITE(*,*) REPEAT(&#039;~&#039;,30)<br />&nbsp; &nbsp; &nbsp; &nbsp; !--- COPY INITIAL MATRIX A[ , ]<br />&nbsp; &nbsp; &nbsp; &nbsp; C(:,:) = A(:,:)<br />&nbsp; &nbsp; &nbsp; &nbsp; !--- COPY INITIAL MATRIX B[ , ]<br />&nbsp; &nbsp; &nbsp; &nbsp; D(:,:) = B(:,:)<br />&nbsp; &nbsp; &nbsp; &nbsp; call cpu_time(START)<br />&nbsp; &nbsp; &nbsp; &nbsp; WRITE(*,&#039;(1X,A,F12.8)&#039;) &#039;start time:&#039;, START<br />&nbsp; &nbsp; &nbsp; &nbsp; DO K = 1, N<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; !--- CODED MATRIX MULTIPLY<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; E(:,:) = 0.D0<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CALL MatMult( C, D, NR, NC, E )<br />&nbsp; &nbsp; &nbsp; &nbsp; END DO<br />&nbsp; &nbsp; &nbsp; &nbsp; call cpu_time(FINISH)<br />&nbsp; &nbsp; &nbsp; &nbsp; WRITE(*,&#039;(1X,A,F12.8)&#039;) &#039;finish time:&#039;, FINISH<br />&nbsp; &nbsp; &nbsp; &nbsp; WRITE(*,&#039;(1X,A,F12.8,A)&#039;) &#039;Run time = &#039;, (finish-start)/N, &#039; seconds.&#039;<br />&nbsp; &nbsp; &nbsp; &nbsp; WRITE(*,&#039;(1X,A18,F12.8/)&#039;) &#039;Relative run time:&#039;, (finish-start)/BEST</p><p>&nbsp; &nbsp; &nbsp; &nbsp; !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br />&nbsp; &nbsp; &nbsp; &nbsp; !--- MATNMULT( A, B )<br />&nbsp; &nbsp; &nbsp; &nbsp; WRITE(*,&#039;(1X,A)&#039;) &#039;MatNMult&#039;<br />&nbsp; &nbsp; &nbsp; &nbsp; WRITE(*,*) REPEAT(&#039;~&#039;,30)<br />&nbsp; &nbsp; &nbsp; &nbsp; !--- COPY INITIAL MATRIX A[ , ]<br />&nbsp; &nbsp; &nbsp; &nbsp; C(:,:) = A(:,:)<br />&nbsp; &nbsp; &nbsp; &nbsp; !--- COPY INITIAL MATRIX B[ , ]<br />&nbsp; &nbsp; &nbsp; &nbsp; D(:,:) = B(:,:)<br />&nbsp; &nbsp; &nbsp; &nbsp; call cpu_time(START)<br />&nbsp; &nbsp; &nbsp; &nbsp; WRITE(*,&#039;(1X,A,F12.8)&#039;) &#039;start time:&#039;, START<br />&nbsp; &nbsp; &nbsp; &nbsp; DO K = 1, N<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; !--- CODED MATRIX MULTIPLY<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; E(:,:) = 0.D0<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CALL MatNMult( C, D, NR, NC, E )<br />&nbsp; &nbsp; &nbsp; &nbsp; END DO<br />&nbsp; &nbsp; &nbsp; &nbsp; call cpu_time(FINISH)<br />&nbsp; &nbsp; &nbsp; &nbsp; WRITE(*,&#039;(1X,A,F12.8)&#039;) &#039;finish time:&#039;, FINISH<br />&nbsp; &nbsp; &nbsp; &nbsp; WRITE(*,&#039;(1X,A,F12.8,A)&#039;) &#039;Run time = &#039;, (finish-start)/N, &#039; seconds.&#039;<br />&nbsp; &nbsp; &nbsp; &nbsp; WRITE(*,&#039;(1X,A18,F12.8/)&#039;) &#039;Relative run time:&#039;, (finish-start)/BEST</p><p>&nbsp; &nbsp; &nbsp; &nbsp; !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br />&nbsp; &nbsp; &nbsp; &nbsp; WRITE(*,*) REPEAT(&#039;~&#039;,30)<br />&nbsp; &nbsp; &nbsp; &nbsp; WRITE(*,&#039;(A//)&#039;) &#039;End of Run...&#039;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; DEALLOCATE ( A, B, C, D, E )</p><p>&nbsp; &nbsp; &nbsp; &nbsp; END PROGRAM MAIN</p><p>&nbsp; &nbsp; &nbsp; &nbsp; !****************************************************************<br />&nbsp; &nbsp; &nbsp; &nbsp; !&nbsp; &nbsp; &nbsp; &nbsp;MATRIX MULTIPLY A x B SUBROUTINES<br />&nbsp; &nbsp; &nbsp; &nbsp; !<br />&nbsp; &nbsp; &nbsp; &nbsp; !****************************************************************<br />&nbsp; &nbsp; &nbsp; &nbsp; SUBROUTINE MMult(A,B,M,N,C)<br />&nbsp; &nbsp; &nbsp; &nbsp; !--- INTRINSIC MATRIX MULTIPLY<br />&nbsp; &nbsp; &nbsp; &nbsp; !****************************************************************<br />&nbsp; &nbsp; &nbsp; &nbsp; IMPLICIT NONE<br />&nbsp; &nbsp; &nbsp; &nbsp; INTEGER*4, INTENT(IN)&nbsp; &nbsp;:: M, N<br />&nbsp; &nbsp; &nbsp; &nbsp; REAL*8, INTENT(IN)&nbsp; &nbsp; &nbsp; :: A(M,N), B(N,M)<br />&nbsp; &nbsp; &nbsp; &nbsp; REAL*8, INTENT(OUT)&nbsp; &nbsp; &nbsp;:: C(M,M)<br />&nbsp; &nbsp; &nbsp; &nbsp; REAL*8 :: D<br />&nbsp; &nbsp; &nbsp; &nbsp; ALLOCATABLE :: D(:,:)<br />&nbsp; &nbsp; &nbsp; &nbsp; ALLOCATE ( D(M,M) )<br />&nbsp; &nbsp; &nbsp; &nbsp; D(:,:) = 0.0D0<br />&nbsp; &nbsp; &nbsp; &nbsp; D(:,:) = MATMUL( A, B )<br />&nbsp; &nbsp; &nbsp; &nbsp; !--- COPY ZERO MATRIX D[] TO C[]<br />&nbsp; &nbsp; &nbsp; &nbsp; C(:,:) = D(:,:)<br />&nbsp; &nbsp; &nbsp; &nbsp; DEALLOCATE ( D )<br />&nbsp; &nbsp; &nbsp; &nbsp; RETURN<br />&nbsp; &nbsp; &nbsp; &nbsp; END SUBROUTINE MMult</p><p>&nbsp; &nbsp; &nbsp; &nbsp; !****************************************************************<br />&nbsp; &nbsp; &nbsp; &nbsp; SUBROUTINE MatMult(A,B,M,N,C)<br />&nbsp; &nbsp; &nbsp; &nbsp; !--- Square matrix where m = n<br />&nbsp; &nbsp; &nbsp; &nbsp; !--- A[m,n] x B[n,m] = C[m,m] using index order I, J, and K.<br />&nbsp; &nbsp; &nbsp; &nbsp; !****************************************************************<br />&nbsp; &nbsp; &nbsp; &nbsp; IMPLICIT NONE<br />&nbsp; &nbsp; &nbsp; &nbsp; INTEGER*4, INTENT(IN)&nbsp; &nbsp;:: M, N<br />&nbsp; &nbsp; &nbsp; &nbsp; REAL*8, INTENT(IN)&nbsp; &nbsp; &nbsp; :: A(M,N), B(N,M)<br />&nbsp; &nbsp; &nbsp; &nbsp; REAL*8, INTENT(OUT)&nbsp; &nbsp; &nbsp;:: C(M,M)<br />&nbsp; &nbsp; &nbsp; &nbsp; REAL*8 :: D<br />&nbsp; &nbsp; &nbsp; &nbsp; INTEGER*4 :: I, J, K<br />&nbsp; &nbsp; &nbsp; &nbsp; ALLOCATABLE :: D(:,:)<br />&nbsp; &nbsp; &nbsp; &nbsp; ALLOCATE ( D(M,M) )<br />&nbsp; &nbsp; &nbsp; &nbsp; D(:,:) = 0.0D0<br />&nbsp; &nbsp; &nbsp; &nbsp; DO I = 1, M<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DO J = 1, M<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DO K = 1, N<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;D(I,J) = D(I,J) + A(I,K)*B(K,J)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; END DO<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; END DO<br />&nbsp; &nbsp; &nbsp; &nbsp; END DO<br />&nbsp; &nbsp; &nbsp; &nbsp; !--- COPY ZERO MATRIX D[] TO C[]<br />&nbsp; &nbsp; &nbsp; &nbsp; C(:,:) = D(:,:)<br />&nbsp; &nbsp; &nbsp; &nbsp; DEALLOCATE ( D )<br />&nbsp; &nbsp; &nbsp; &nbsp; RETURN<br />&nbsp; &nbsp; &nbsp; &nbsp; END SUBROUTINE MATMult</p><p>&nbsp; &nbsp; &nbsp; &nbsp; !****************************************************************<br />&nbsp; &nbsp; &nbsp; &nbsp; SUBROUTINE MatNMult(A,B,M,N,C)<br />&nbsp; &nbsp; &nbsp; &nbsp; !--- Multiiplies A = B*C using implicit K index in 2nd dimension<br />&nbsp; &nbsp; &nbsp; &nbsp; !****************************************************************<br />&nbsp; &nbsp; &nbsp; &nbsp; IMPLICIT NONE<br />&nbsp; &nbsp; &nbsp; &nbsp; INTEGER*4, INTENT(IN)&nbsp; &nbsp;:: M, N<br />&nbsp; &nbsp; &nbsp; &nbsp; REAL*8, INTENT(IN)&nbsp; &nbsp; &nbsp; :: A(M,N), B(N,M)<br />&nbsp; &nbsp; &nbsp; &nbsp; REAL*8, INTENT(OUT)&nbsp; &nbsp; &nbsp;:: C(M,M)<br />&nbsp; &nbsp; &nbsp; &nbsp; REAL*8 :: D<br />&nbsp; &nbsp; &nbsp; &nbsp; INTEGER*4 :: I, J<br />&nbsp; &nbsp; &nbsp; &nbsp; ALLOCATABLE :: D(:,:)<br />&nbsp; &nbsp; &nbsp; &nbsp; ALLOCATE ( D(M,M) )<br />&nbsp; &nbsp; &nbsp; &nbsp; D(:,:) = 0.0D0<br />&nbsp; &nbsp; &nbsp; &nbsp; DO I = 1, M<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DO J = 1, N<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; D(I,1:M) = D(I,1:M) + A(I,J)*B(J,1:M)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; END DO<br />&nbsp; &nbsp; &nbsp; &nbsp; END DO<br />&nbsp; &nbsp; &nbsp; &nbsp; !--- COPY ZERO MATRIX D[] TO C[]<br />&nbsp; &nbsp; &nbsp; &nbsp; C(:,:) = D(:,:)<br />&nbsp; &nbsp; &nbsp; &nbsp; DEALLOCATE ( D )<br />&nbsp; &nbsp; &nbsp; &nbsp; RETURN<br />&nbsp; &nbsp; &nbsp; &nbsp; END SUBROUTINE MatNMult</p><p>&nbsp; &nbsp; &nbsp; &nbsp; !****************************************************************<br />&nbsp; &nbsp; &nbsp; &nbsp; SUBROUTINE MatMMult(A,B,M,N,C)<br />&nbsp; &nbsp; &nbsp; &nbsp; !--- Multiiplies A = B*C using implicit K index in 1st dimension<br />&nbsp; &nbsp; &nbsp; &nbsp; !****************************************************************<br />&nbsp; &nbsp; &nbsp; &nbsp; IMPLICIT NONE<br />&nbsp; &nbsp; &nbsp; &nbsp; INTEGER*4, INTENT(IN)&nbsp; &nbsp;:: M, N<br />&nbsp; &nbsp; &nbsp; &nbsp; REAL*8, INTENT(IN)&nbsp; &nbsp; &nbsp; :: A(M,N), B(N,M)<br />&nbsp; &nbsp; &nbsp; &nbsp; REAL*8, INTENT(OUT)&nbsp; &nbsp; &nbsp;:: C(M,M)<br />&nbsp; &nbsp; &nbsp; &nbsp; REAL*8 :: D<br />&nbsp; &nbsp; &nbsp; &nbsp; INTEGER*4 :: I, J<br />&nbsp; &nbsp; &nbsp; &nbsp; ALLOCATABLE :: D(:,:)<br />&nbsp; &nbsp; &nbsp; &nbsp; ALLOCATE ( D(M,M) )<br />&nbsp; &nbsp; &nbsp; &nbsp; D(:,:) = 0.0D0<br />&nbsp; &nbsp; &nbsp; &nbsp; DO I = 1, M<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DO J = 1, N<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; D(1:M,I) = D(1:M,I) + A(1:M,J)*B(J,I)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; END DO<br />&nbsp; &nbsp; &nbsp; &nbsp; END DO<br />&nbsp; &nbsp; &nbsp; &nbsp; !--- COPY ZERO MATRIX D[] TO C[]<br />&nbsp; &nbsp; &nbsp; &nbsp; C(:,:) = D(:,:)<br />&nbsp; &nbsp; &nbsp; &nbsp; DEALLOCATE ( D )<br />&nbsp; &nbsp; &nbsp; &nbsp; RETURN<br />&nbsp; &nbsp; &nbsp; &nbsp; END SUBROUTINE MatMMult</p><p>&nbsp; &nbsp; &nbsp; &nbsp; !****************************************************************<br />&nbsp; &nbsp; &nbsp; &nbsp; SUBROUTINE MatDotMult(A,B,M,N,C)<br />&nbsp; &nbsp; &nbsp; &nbsp; !****************************************************************<br />&nbsp; &nbsp; &nbsp; &nbsp; IMPLICIT NONE<br />&nbsp; &nbsp; &nbsp; &nbsp; INTEGER*4, INTENT(IN)&nbsp; &nbsp;:: M, N<br />&nbsp; &nbsp; &nbsp; &nbsp; REAL*8, INTENT(IN)&nbsp; &nbsp; &nbsp; :: A(M,N), B(N,M)<br />&nbsp; &nbsp; &nbsp; &nbsp; REAL*8, INTENT(OUT)&nbsp; &nbsp; &nbsp;:: C(M,M)<br />&nbsp; &nbsp; &nbsp; &nbsp; REAL*8 :: D<br />&nbsp; &nbsp; &nbsp; &nbsp; INTEGER*4 :: I, J<br />&nbsp; &nbsp; &nbsp; &nbsp; ALLOCATABLE :: D(:,:)<br />&nbsp; &nbsp; &nbsp; &nbsp; ALLOCATE ( D(M,M) )<br />&nbsp; &nbsp; &nbsp; &nbsp; D(:,:) = 0.0D0<br />&nbsp; &nbsp; &nbsp; &nbsp; DO I = 1, M<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DO J = 1, M<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; D(I,J) = DOT_PRODUCT( A(I,1:N), B(1:N,J) )<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; END DO<br />&nbsp; &nbsp; &nbsp; &nbsp; END DO<br />&nbsp; &nbsp; &nbsp; &nbsp; !--- COPY ZERO MATRIX D[] TO C[]<br />&nbsp; &nbsp; &nbsp; &nbsp; C(:,:) = D(:,:)<br />&nbsp; &nbsp; &nbsp; &nbsp; DEALLOCATE ( D )<br />&nbsp; &nbsp; &nbsp; &nbsp; RETURN<br />&nbsp; &nbsp; &nbsp; &nbsp; END SUBROUTINE MatDotMult<br />&nbsp; &nbsp; &nbsp; &nbsp; !****************************************************************<br />&nbsp; &nbsp; &nbsp; &nbsp; !&nbsp; &nbsp; &nbsp; &nbsp;END OF MATRIX MULTIPLY SUBROUTINES<br />&nbsp; &nbsp; &nbsp; &nbsp; !****************************************************************</p>]]></content>
			<author>
				<name><![CDATA[drfrank]]></name>
				<uri>https://forums.approximatrix.com/profile.php?id=223</uri>
			</author>
			<updated>2018-08-14T18:34:47Z</updated>
			<id>https://forums.approximatrix.com/viewtopic.php?pid=3155#p3155</id>
		</entry>
</feed>
