- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I have a compute intensive loop parallelized using OpenMP:
!$omp parallel do
do j = 1, nc
call sub1(.....
call sub2(.....
......
.end do
!$omp end parallel do
The software I am developing uses a progress bar, and even with the parallelization the loop can be slow. I would like to insert a progress bar update into it. The progress bar works by checking how long a time has elapsed since it was last updated; if it is greater than a certain limit, then the update occurs via:
call updateProgressBar()
Is there any way of doing this?
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
The following is a simple hack:
! TitleProgressBar.f90
program TitleProgressBar
use ifwin
use omp_lib
implicit none
logical :: bResult
integer, parameter :: MaxTitleLength = 200
character(len=*), parameter :: YourProgramTitle = "TitleProgressBar"
integer :: i
integer :: PercentDone, tick
integer :: N
bResult = SetConsoleTitle(YourProgramTitle)
! ...
PercentDone = -1 ! -1 to display 0% done bar
tick = 0
N=10000
!$omp parallel do
do i = 1, N
call doWork(i)
!$omp atomic update
tick = tick + 1
! Race condition benign
if((tick * 100) / N > PercentDone) then
PercentDone = min((tick * 100) / N, 100)
bResult = SetConsoleTitle(YourProgramTitle // ' [' // REPEAT('|',PercentDone) // REPEAT(' ', 100-PercentDone) // ']' // CHAR(0))
endif
end do
!$omp end parallel do
bResult = SetConsoleTitle(YourProgramTitle)
pause
end program TitleProgressBar
subroutine doWork(i)
call sleepqq(mod(i,10))
end subroutine doWork
Jim Dempsey
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Try replacing the trailing space with CHAR(249)
Space and '|' are not nearly the same horizontal spacing, CHAR(249) is small center dot and approximates width of '|'
While you can do a Dialog box, this would add a thread. With a significantly more programming you can add a status bar to the console window and place a progress bar there.
Note, display visually stops at 99% (100% is immediately replaced by empty progress). You can change this by replacing the title at a later time (e.g. after you write results to file).
Jim Dempsey
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Also, if you wish, you could code with critical section (introducing delays) or have only one of the threads update (may be jerky but less overhead).
Presumably, if the doWork is moderately long, lines 25 and 26 may complete before a different thread notes the update.
You might consider using:
integer, volatile :: PercentDone
In the event that your doWork gets inlined, this would prevent PercentDone from being registerized.
By .NOT. using thread-safe update of PercentDone you are trading off a small probability of two (or more) threads updating the progress bar to the same value against the overhead of all threads going through a critical section (or other means of coordination) on every tick update. A bargain I presume.
Jim Dempsey
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Thank you Jim - this is just what I need.
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page