OpenMP on FreeBSD

Anton Shterenlikht mexas at bristol.ac.uk
Thu Feb 2 09:55:20 UTC 2012


On Wed, Feb 01, 2012 at 04:29:59PM -0800, Dennis Glatting wrote:
> On Thu, 2012-02-02 at 00:09 +0000, Anton Shterenlikht wrote:
> > I'm new to OpenMP. I wonder
> > if there are any special considerations
> > when running OpenMP on FreeBSD?
> > 
> 
> I run OpenMP. No special consideration. Here's a chunk from my Makefile:
> 
> TARG=ecc.enc ecc.dec
> 
> $TARG: *.cc *.h Makefile
>         g++ -Wall -fopenmp -g -O ${INCL} ${LIBS} -o ecc.enc *.cc
>         g++ -Wall -fopenmp -g -O ${INCL} ${LIBS} -o ecc.dec *.cc
> 
> 
> > For example, I have this OMP parallelised
> > fortran program, nested do loops, compiled
> > with gfortran46. When I run it with 2 threads
> > on a 2-cpu box, I see in top(1):
> > 
> >   PID    UID   PRI NICE   SIZE    RES STATE   C   TIME    CPU COMMAND
> > 63995   1001    89    0 57048K 34272K CPU1    1   1:06 55.08% dummy.sx{dummy.sx}
> > 63995   1001    87    0 57048K 34272K RUN     1   1:02 52.39% dummy.sx{dummy.sx}
> >    11      0   155 ki31     0K    32K RUN     0 376:58 51.46% idle{idle: cpu0}
> >    11      0   155 ki31     0K    32K RUN     1 368:18 45.36% idle{idle: cpu1}
> > 
> > I wonder why, even after a minute of run time,
> > I still have nearly a whole cpu idle?
> > 
> 
> What is the program doing? I/O can significantly limit OMP value. Also,
> you need to make sure you code your loops properly or else you have a
> single-threaded application, without warning.

Here's my parallel bit:

!$OMP PARALLEL DEFAULT(NONE) &
!$OMP   SHARED(AEND,SPACE1,SPACE2,SIZE1,SIZE2,SIZE3) &
!$OMP   PRIVATE(STEP,RANDN,X1,X2,X3)

!$OMP DO SCHEDULE(RUNTIME)

   DO X3 = 1,SIZE3
     DO X2 = 1,SIZE2
       DO X1 = 1,SIZE1

         IF(SPACE1(X1,X2,X3).EQ.0) THEN
           AEND = .FALSE.                ! UPDATE AT LEAST ONE CELL
           CALL RANDOM_NUMBER(RANDN)     ! 0 <= RANDN < 1
           STEP = NINT(RANDN*2-1)        ! STEP = [-1 0 1]
           SPACE2(X1,X2,X3) = SPACE1(X1+STEP(1),X2+STEP(2),X3+STEP(3))
         END IF
 
       END DO
     END DO
   END DO

!$OMP END DO
!$OMP END PARALLEL

There's no I/O at all. Not sure what you mean
by proper looping. The threads are definitely
created. I use "setenv OMP_NUM_THREADS" to set
the number of threads. Then I monitor thread
creation with top -H. The number of threads
shown there matches what I set. So I'm pretty
sure the executable is multi-threaded.

Perhaps I should explore various SCHEDULE options?

By the way, what sort of speed-up do you
see with your loop? And what ratio threads/cores
is optimal for you?

Many thanks

-- 
Anton Shterenlikht
Room 2.6, Queen's Building
Mech Eng Dept
Bristol University
University Walk, Bristol BS8 1TR, UK
Tel: +44 (0)117 331 5944
Fax: +44 (0)117 929 4423


More information about the freebsd-questions mailing list