Opened 7 years ago

Closed 6 years ago

#1266 closed Defect (fixed)

AMM12, ifort and -O3 optimization issue

Reported by: jchanut Owned by: nemo
Priority: low Milestone:
Component: OCE Version: release-3.6
Severity: Keywords:


See also ticket #1254 ?

Confirmation/explanation from other people having experienced trouble with AMM12 and -O3 optimization levels with ifort would be greatly appreciated.

Looking carefully at what causes AMM12 to blow up when switching from -O2 to-O3 optimization level (ifort 12, 13 or 14), Mondher Chekki, found a weird behaviour in dynspg_ts module. The problem comes from the following loops:

      zu_frc(:,:) = 0._wp
      zv_frc(:,:) = 0._wp

      DO jk = 1, jpkm1
#if defined key_vectopt_loop
         DO jj = 1, 1         !Vector opt. => forced unrolling
            DO ji = 1, jpij
         DO jj = 1, jpj
            DO ji = 1, jpi
               zu_frc(ji,jj) = zu_frc(ji,jj) + fse3u_n(ji,jj,jk) * ua(ji,jj,jk) * umask(ji,jj,jk)
               zv_frc(ji,jj) = zv_frc(ji,jj) + fse3v_n(ji,jj,jk) * va(ji,jj,jk) * vmask(ji,jj,jk)
            END DO
         END DO
      END DO

Writing this code block with 2d arrays (see below) solves the problem, in the sense that the model runs fine and produces identical results (as checked from the solver.stat file over a 2 days run) and whatever the optimization level is. It seems that the use of temporary pointers is the source of the problem, aggressive compiler optimization creating a kind of memory aliasing in that particular case.

Formulation that solves the pb:

      DO jk = 1, jpkm1
         zu_frc(:,:) = zu_frc(:,:) + fse3u_n(:,:,jk) * ua(:,:,jk) * umask(:,:,jk)
         zv_frc(:,:) = zv_frc(:,:) + fse3v_n(:,:,jk) * va(:,:,jk) * vmask(:,:,jk)
      END DO

Compiler options used:
-O3 -fp-model precise -traceback -r8 -convert big_endian -assume byterecl

Commit History (0)

(No commits)

Change History (1)

comment:1 Changed 6 years ago by jchanut

  • Resolution set to fixed
  • Status changed from new to closed

Changed in revision 4687

Note: See TracTickets for help on using tickets.