Re-factor the JT4, JT65 and JT9 decoders as Fortran modules using type
bound procedures, the decoder types implement a callback procedure
such that he client of the decoder can interpret the decode results as
they need.
The JT4 decoder has a second callback that delivers message averaging
status. Also the previously separate source files lib/jt4a.f90 and
lib/avg4.f90 have been merged into lib/jt4_decode.f90 as private type
bound procedures of the new jt4_decoder type.
Re-factored the lib/decoder.f90 subroutine to utilize the new decoder
types. Added local procedures to process decodes and averaging results
including the necessary OpenMP synchronization directives for parallel
JT9+JT65 decoding.
Added the jt65_test module which is a basic test harness for JT65
decoding. Re-factored the jt65 utility to utilize the new jt65_test
module.
Changed a few integers to logical variables where their meaning is
clearly binary.
git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@6324 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
Groundwork for calling the decoders directly from C/C++ threads.
To access the timer module timer_module must now be used.
Instrumented code need only use the module function 'timer' which is
now a procedure pointer that is guaranteed to be associated (unless
null() is assigned to it, which should not be done). The default
behaviour of 'timer' is to do nothing.
If a Fortran program wishes to profile code it should now use the
timer_impl module which contains a default timer implementation. The
main program should call 'init_timer([filename])' before using 'timer'
or calling routines that are instrumented. If
'init_timer([filename])'. If it is called then an optional file name
may be provided with 'timer.out' being used as a default. The
procedure 'fini_timer()' may be called to close the file.
The default timer implementation is thread safe if used with OpenMP
multi-threaded code so long as the OpenMP thread team is given the
copyin(/timer_private/) attribute for correct operation. The common
block /timer_private/ should be included for OpenMP use by including
the file 'timer_common.inc'.
The module 'lib/timer_C_wrapper.f90' provides a Fortran wrapper along
with 'init' and 'fini' subroutines which allow a C/C++ application to
call timer instrumented Fortran code and for it to receive callbacks
of 'timer()' subroutine invocations. No C/C++ timer implementation is
provided at this stage.
git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@6320 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
This requires setting newdat=0 after the big FFT is computed. In the OMP
code this must be done separately for each mode; so new variables newdat9
and newdat65 have been defined. Both are set to "newdat", the value
forwarded from the GUI, each time jt9[_omp][.exe] goes into action.
git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@4946 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
Also moved the same large array from stack to heap which along with
other prior changes now allows the Windows jt9 OpenMP executable to
run with a default stack size again.
This also removes a crash on the Mac version which was probably due to
excessive stack usage.
Net result is an even faster JT9 decoder.
git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@4942 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
More detailed message to come, with comparative timing statistics.
git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@4926 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
The long FFTs can now use the multi-threaded FFTW routines.
Subroutine decode9.f90 was renamed jt9fano.f90.
The JT9 decoder's top-level functions were removed from decoder.f90
and put into a separate subroutine decjt90.f90.
Subroutine decoder.f90 is now configured for possible use of OpenMP
SECTIONS, with the JT9 and JT65 decoders running concurrently on
a multi-core machine. Note, however, that this concurrent processing
is not yet fully implemented. Probably calls to timer need to be removed;
some variables used in calls to jt65a and decjt9 may need to be
declared PRIVATE in decoder; some sections probably need to be declared
CRITICAL; probably some SAVE statements in downstream routines have
made them not thread-safe; etc., etc.
I'm a neophyte at using OpenMP. Comments, suggestions, and/or tests by
others will be welcome!
git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@4919 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
This commit will serve as a benchmark for comparison with new code to
be written.
git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@3266 ab8295b8-cf94-4d9e-aec4-7959e3be5d79