« Back to Blog

The Magic of Compilers

Dec 20, 18  fortran

One of the issues that plagues weather data processing–like any other data–is speed…we want our science processed and we want it processed fast!

I refactored some of my algorithm code today that is in FORTRAN–specifically the parts where I look at static output flags specified at compilation time that determine what variables I need to calculate. A thought that has been kicking around in my head is the time hit my program takes whenever it checks the output flags every time in a 175,000 iteration loop. You would think I could simply move this to something outside of the loop, but to do so would unfortunately require a 2,000,000 x 175,000 sized real array. I normally use the -O3 flag when compiling to provide the strictest optimization though I was not completely sure whether that was a high enough optimization to take these sections. So, I decided to run some tests and see if the compiler removed the null flagged sections within the loop.

(These tests are run on a 24 core Intel Xeon X5650 2.67 GHz, 50 GB RAM machine.)

I constructed a program that would basically make it obvious whether or not a null flagged if statement is removed. It consists of a simple loop inside an if flag statement inside of another simple loop:

INTEGER           :: flag, i, j
REAL              :: start, finish

flag = 0

ALLOCATE(a(1000000, 30))

PRINT *, start

DO i = 1, 1000000000
    IF (flag .EQ. 1) THEN
        DO j = 1, 1000000
            a(i,4) = RAND(0)
        END DO
    END IF

PRINT *, finish


I compiled this program twice, once without and once with the the optimization flag:

$ gfortran test.f90 -o non-optimized $ gfortran -O3 test.f90 -o optimized

I then ran the two tests to see what the result was:

$ ./non-optimized 0.0000000 2.6605940 $ ./optimized 0.0000000 0.0000000

So, it looks like the compiler completely removed the if block.

[top] | « Back to Blog