PROGRAM MAT_MUL C C On an SGI Origin 2000 compile with: C (-apo = automatic parallelization option) C C f90 -r8 -apo -r10000 -O3 -col120 -o mat_mul.exe mat_mul.f C INTEGER N, GETENV, OMP_NUM_THREADS EXTERNAL GETENV CHARACTER ENV_VALUE*8 C C READ (5, *) N ! Array NxN C ISTAT = GETENV('OMP_NUM_THREADS', ENV_VALUE) ! Get value of OMP_NUM_THREADS Env_var READ(ENV_VALUE, FMT='(I8)') OMP_NUM_THREADS ! Converts int strg to int binary C CALL ARRAY_MULT(N, OMP_NUM_THREADS) C STOP END C --------------------------------------------------------------------- C SUBROUTINE ARRAY_MULT(N, N_CPUS) INTEGER N, N_CPUS, NSQ REAL (KIND=8) SECS, TM1, TM2, TIMEF REAL (KIND=8) AA(N,N), BB(N,N), CC(N,N), PI EXTERNAL TIMEF C PI = 4.0D1 * ATAN(1.0D1) NSQ =N*N ANG_INCR = (2.0D1 * PI)/NSQ C DO J=1, N DO I=1, N ! Compute AA & BB AA(I,J) = COS( FLOAT(I+(J-1)*NSZ)*ANG_INCR ) BB(I,J) = SIN( FLOAT(I+(J-1)*NSZ)*ANG_INCR ) END DO END DO C TM1 = TIMEF() ! elapsed real_time (millisecs): Start counting C DO J=1,N DO K=1, N DO I=1, N CC(I,J) = CC(I,J) + AA(I,K)*BB(K,J) END DO END DO END DO C TM2 = TIMEF() SECS = (TM2 - TM1) * 1.E-3 C WRITE(6,*) WRITE(6,*) 'NUMBER OF CPUS/TASKS ASSIGNED = ',N_CPUS WRITE(6,*) 'Parallelized Matrix Multiplication for ',N,'x',N,' Size' WRITE(6,*) WRITE(6,*) 'Elapsed Wall Clock Time ',SECS,' Seconds' WRITE(6,*) C PRINT *, CC(1234,1), CC(8023,1), CC(2345,1) C RETURN END