On Thu, 2 Feb 2012, Anton Shterenlikht wrote:
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.
The issue I found in C++ is a "barrier" had to be defined, which is the
first tagged bracket in my code snippet. Without that barrier the pragma
on the "for" loop was single threaded. Can't say about Fortran, sorry.
I haven't coded Fortran since collage and can't comment on your code.
Perhaps I should explore various SCHEDULE options?
Nope. When it works you will notice. Under FreeBSD I do a "top -P" in a
second window. You will see the cores get busy.
By the way, what sort of speed-up do you
see with your loop? And what ratio threads/cores
is optimal for you?
A forty five minute task down to seven minutes on an eight core, AMD 8150
processor running at 4GHz (slightly over clocked). The effort would take
less time if I recoded using a custom thread/code solution but I'm talking
about maybe another minute or two. In the end I felt better was the enemy
of good.
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
_______________________________________________
freebsd-questions@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-questions
To unsubscribe, send any mail to "freebsd-questions-unsubscr...@freebsd.org"