Silverfrost Forums

Welcome to our forums

Shortest example of multithreaded run with FTN95

16 Jul 2008 11:44 #3467

How will look in FTN95 **absolutely simplest and shortest ** program which will launch two separate subroutines in two threads, say, ones emulating long run? Emulating programs could look like this

integer function run1() a=2.0 do i=1,10000000 a=alog(exp(a)) enddo run1=1 end

19 Jul 2008 6:52 (Edited: 19 Jul 2008 9:31) #3482
19 Jul 2008 9:30 #3485

OK, what I'd like to see is the following. Here is the shortest code which I'd like to be working in FTN95. Unfortunately it does not open another thread if you click on tab 2 after clicking on tab 1.

What it is unfortunately doing, it stops for a while execution of the function run1 when you click 2 and starts run2, when run2 finishes, run1 continues. You can see that if you open Task Manager on your multicore PC. If there would be multithreading then two cores would start the tasks independently grabbing 100% CPU time

Multithreading is the simplest way of doing simulations in parallel. We can for example devide some long running DO loop this way into deviding it to two parts and run both parts on separate threads, hence numerous cores will be improving execution speed by factor 2, 4 or 8 or N times depending on amount of your cores.

[color=green:9787c37061]It can be done with .NET as shows FTN95 Threads example, but it is kind of cumbersome. Can it be done without .NET ? .NET in current version is the complication without simplification eye candies. Most of people do not like to know even Clearwin+, which is great, so there is no way they will like the next level of complexity. Fortran lives 50+ years because it is simplicity (and due to that speed) up to ultimate stupidity. Salford/Silverfrost fortran is unique in the sense that it is the only one which can offer us the so called 'click programming' for each and everyone because it has build-in GUI builder (Clearwin+, Visual Clearwin). I'm not a visionary by any means, but IMHO time is gone for complex line-by-line programming like it is gone for lineprinters. Also IMHO everyone would use .NET if all applications were assembled by mouse clicks. Is this how it is done now using Visual Studio? This 'visual studio' is not a real visual studio I'd like to see[/color:9787c37061]

   use clrwin
   integer  run1, run2
   external run1, run2

   i=winio@('%ww&')
   i=winio@('%^tt[1]%ff&', run1)
   i=winio@('%ac[Esc]&','exit')
   i=winio@('%ac[Ctrl+1]&',run1)
   i=winio@('%ac[Ctrl+2]&',run2)
   i=winio@('%^tt[2]', run2)
   end

!----------------------
integer function run1() 
   use clrwin
   print*,'1 is running'
   CALL PERMIT_ANOTHER_callback@()
   a=2.0 
   do k=1,50 
   call temporary_yield@()
   do i=1,10000000 
   a=alog(exp(a)) 
   enddo 
   enddo 
   print*,'1 ended'
   run1=1 
end
!----------------------
integer function run2() 
   use clrwin
   print*,'2 is running'
   a=2.0 
   do k=1,50 
   call temporary_yield@()
   do i=1,10000000 
   a=alog(exp(a)) 
   enddo 
   enddo 
   print*,'2 ended'
   run2=1 
end
23 Jul 2008 9:02 #3519

With this respect there was some real life experience anecdot. Professor asking students: -'Do you know how integrate this kind of functions?'. Total silence. Then he asked : -'Did you know how integrate this kind of functions?'. Silence again. Then he asked next approximation question: -'At the time of exam last year did you you know how integrate this kind of functions?'. Student again sitting still, and no one responds. Finally he asks: -'Did you have to know at the time of exam last year how integrate this kind of functions?'. And the answer finally was yes 😦

OK, even simplesr question. I am confused do we need for FTN95 multithreading code all that threads.ftn95p, THREADS.SLN, THREADS.suo files (found in the Examples directory) containing something like this (or even binary) which I have no clue what relationship have to the Fortran:

'General' { 'ProjectIdGuid' = '{6025DA35-1FE6-45F1-B0A4-889176813D25}' } 'Configurations' { 'Debug|Win32' { 'Windows' = 'Yes' 'SealedClass' = 'Yes' 'ContainingClass' = '' 'Version' = '' 'Stack_NET' = '' 'Map' = '' 'Silent' = 'No' 'Base' = '' 'Exportall' = 'No' 'Heap' = '' 'MultiThreaded' = 'No' 'Extras' = '' 'VirtualCommon' = '' 'InterfaceOnly' = 'No' 'NoLink' = 'No' 'DebugInfo' = 'Yes' 'Check' = 'No' 'Undef' = 'No' 'CheckMate' = 'No' 'FullDebug' = 'No' 'BoundsCheck' = 'No' 'DebugSource' = 'No' 'Overflow' = 'No' 'Profile' = 'No' 'QuickBounds' = 'No' 'Runtrace' = 'No' 'SuppressArgCheck' = 'No' 'Timing' = 'No' 'Underflow' = 'No' 'Optimise' = 'No' 'P6' = 'Yes' 'UnrollLimit' = ''

or

Microsoft Visual Studio Solution File, Format Version 8.00 Project('') = 'Threads', 'Threads.ftn95p', '{6025DA35-1FE6-45F1-B0A4-889176813D25}' ProjectSection(ProjectDependencies) = postProject EndProjectSection EndProject Global GlobalSection(SolutionConfiguration) = preSolution CheckMate .NET = CheckMate .NET CheckMate Win32 = CheckMate Win32 Release .NET = Release .NET Release Win32 = Release Win32 EndGlobalSection GlobalSection(ProjectConfiguration) = postSolution {6025DA35-1FE6-45F1-B0A4-889176813D25}.CheckMate .NET.ActiveCfg = CheckMate|.NET {6025DA35-1FE6-45F1-B0A4-889176813D25}.CheckMate .NET.Build.0 = CheckMate|.NET {6025DA35-1FE6-45F1-B0A4-889176813D25}.CheckMate Win32.ActiveCfg = CheckMate|Win32 {6025DA35-1FE6-45F1-B0A4-889176813D25}.CheckMate Win32.Build.0 = CheckMate|Win32

Are those FTN95 settings just for Microsoft Dev Studio and are they needed if we do not use MS Dev Studio?

And what is this assembly_external in the header:

........ include <clearwin.ins> assembly_external (name='System.Threading.Thread.Sleep') thread_sleep data num_iterations/500/ .......

or 'object' here

integer function start_thread1() use thread_control external thread_proc object ('System.Threading.Thread') threadObject .............

25 Jul 2008 7:44 (Edited: 10 May 2012 12:55) #3556

This is what I approximately wanted, though it is not shortest example 😃...Compilation: ftn95 mult01.FOR /clr /link /free /multi_threaded A lot of such examples must be included into Demo...

! Multithreading example mult01.for
! Dan R Right 2008
!
! Watch in Task Manager how two sub run1 and run2
! will grab two processors CPU time, 
! essentially working in parallel
!
! Compilation: ftn95 mult01.FOR /clr /link /free /multi_threaded
!
include <clearwin.ins>
EXTERNAL run1, run2

CALL CREATE_THREAD@(run1,42)
CALL CREATE_THREAD@(run2,43)

END
!---------------- 
subroutine run1()
   include <clearwin.ins>
   lock;   print*,'Thr.1 started'; end lock
   a=2.0 
   do k=1,30 
   do i=1,10000000 
   a=alog(exp(a)) 
   enddo 
   enddo 
   lock;   print*,'Thr.1 ended' ; end lock
end 
!---------------- 
subroutine run2()
   include <clearwin.ins>
   lock;   print*,'Thr.2 started' ;end lock
   a=2.0 
   do k=1,40 
   do i=1,10000000 
   a=alog(exp(a)) 
   enddo 
   enddo 
   lock;   print*,'Thr.2 ended' ;end lock
end
25 Jul 2008 9:51 #3559

In your previous post all of those settings were project related to VS. The statements you do not recognise are .NET extensions.

Please login to reply.