<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Recent changes to OpenMP Fortran Timers</title><link>https://sourceforge.net/p/ichnaea/wiki/OpenMP%2520Fortran%2520Timers/</link><description>Recent changes to OpenMP Fortran Timers</description><atom:link href="https://sourceforge.net/p/ichnaea/wiki/OpenMP%20Fortran%20Timers/feed" rel="self"/><language>en</language><lastBuildDate>Thu, 30 Jan 2014 10:58:23 -0000</lastBuildDate><atom:link href="https://sourceforge.net/p/ichnaea/wiki/OpenMP%20Fortran%20Timers/feed" rel="self" type="application/rss+xml"/><item><title>OpenMP Fortran Timers modified by Iain Miller</title><link>https://sourceforge.net/p/ichnaea/wiki/OpenMP%2520Fortran%2520Timers/</link><description>&lt;div class="markdown_content"&gt;&lt;h2 id="openmp-fortran-timers-module"&gt;OpenMP Fortran Timers Module&lt;/h2&gt;
&lt;p&gt;For codes that use PMTM in multiple modules and threads, the timer handles will need to be made available to all modules that want to control the timers. The easiest way is to make them explicitly &lt;strong&gt;threadprivate&lt;/strong&gt; as shown below. If the timers and their uses do not occur in the same parallel region as might be suggested if using a solution similar to the serial version of the subroutine below, then it is important to observe the conditions about preservation of &lt;strong&gt;threadprivate&lt;/strong&gt; variables as noted in section &lt;em&gt;”2.9.2 threadprivate Directive”&lt;/em&gt; of the OpenMP 3.0 standard. To preserve values, this suggests parallel regions should not be nested, should have identical thread counts and have the dynamic adjustment feature set to false.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="k"&gt;module &lt;/span&gt;&lt;span class="nv"&gt;openmp_pmtm_timers&lt;/span&gt; 
    &lt;span class="k"&gt;use &lt;/span&gt;&lt;span class="nv"&gt;PMTM&lt;/span&gt;
    &lt;span class="k"&gt;implicit none&lt;/span&gt;

&lt;span class="k"&gt;    type &lt;/span&gt;&lt;span class="nv"&gt;timers_type&lt;/span&gt; 
        &lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;pmtm_timer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;::&lt;/span&gt; &lt;span class="nv"&gt;timer1&lt;/span&gt; 
        &lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;pmtm_timer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;::&lt;/span&gt; &lt;span class="nv"&gt;timer2&lt;/span&gt; 
        &lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;pmtm_timer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;::&lt;/span&gt; &lt;span class="nv"&gt;timer3&lt;/span&gt;
    &lt;span class="k"&gt;end type&lt;/span&gt;

&lt;span class="k"&gt;    type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;timers_type&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;::&lt;/span&gt; &lt;span class="nv"&gt;timers&lt;/span&gt;
    &lt;span class="k"&gt;common&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;timers_private&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nv"&gt;timers&lt;/span&gt;
    &lt;span class="c"&gt;!$omp threadprivate (/timers_private/)&lt;/span&gt;

&lt;span class="k"&gt;contains&lt;/span&gt;

    &lt;span class="c"&gt;! Call this interface if the timers should be created from a serial context prior to &lt;/span&gt;
    &lt;span class="c"&gt;! any parallel work.&lt;/span&gt;

    &lt;span class="k"&gt;subroutine &lt;/span&gt;&lt;span class="nv"&gt;create_timers_serial&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; 
        &lt;span class="c"&gt;!$omp parallel&lt;/span&gt;
        &lt;span class="k"&gt;call &lt;/span&gt;&lt;span class="nv"&gt;create_timers_parallel&lt;/span&gt; 
        &lt;span class="c"&gt;!$omp end parallel&lt;/span&gt;
    &lt;span class="k"&gt;end subroutine&lt;/span&gt;

    &lt;span class="c"&gt;! Call this interface if already within a &amp;quot;parallel&amp;quot; region.&lt;/span&gt;

    &lt;span class="k"&gt;subroutine &lt;/span&gt;&lt;span class="nv"&gt;create_timers_parallel&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; 
        &lt;span class="k"&gt;call &lt;/span&gt;&lt;span class="nv"&gt;create_timer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;timers&lt;/span&gt;&lt;span class="p"&gt;%&lt;/span&gt;&lt;span class="nv"&gt;timer1&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Timer 1&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;call &lt;/span&gt;&lt;span class="nv"&gt;create_timer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;timers&lt;/span&gt;&lt;span class="p"&gt;%&lt;/span&gt;&lt;span class="nv"&gt;timer2&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Timer 2&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;call &lt;/span&gt;&lt;span class="nv"&gt;create_timer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;timers&lt;/span&gt;&lt;span class="p"&gt;%&lt;/span&gt;&lt;span class="nv"&gt;timer3&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Timer 3&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nv"&gt;endsubroutine&lt;/span&gt; &lt;span class="nv"&gt;create_timers_parallel&lt;/span&gt;

    &lt;span class="k"&gt;subroutine &lt;/span&gt;&lt;span class="nv"&gt;create_timer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;timer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;timer_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
        &lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;pmtm_timer&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="k"&gt;intent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;out&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;::&lt;/span&gt; &lt;span class="nv"&gt;timer&lt;/span&gt; 
        &lt;span class="kt"&gt;character&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="o"&gt;=*&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="k"&gt;intent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;in&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="kd"&gt;::&lt;/span&gt; &lt;span class="nv"&gt;timer_name&lt;/span&gt;

        &lt;span class="k"&gt;call &lt;/span&gt;&lt;span class="nv"&gt;PMTM_create_timer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;PMTM_DEFAULT_GROUP&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;timer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&lt;/span&gt;
                    &lt;span class="nv"&gt;timer_name&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;PMTM_TIMER_ALL&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;pmtm_status&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;pmtm_status&lt;/span&gt; &lt;span class="o"&gt;/=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="k"&gt;            write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;PMTM_get_error_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;pmtm_status&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
        &lt;span class="k"&gt;endif&lt;/span&gt;
&lt;span class="k"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;endsubroutine&lt;/span&gt; &lt;span class="nv"&gt;create_timer&lt;/span&gt; 

&lt;span class="k"&gt;end module&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Iain Miller</dc:creator><pubDate>Thu, 30 Jan 2014 10:58:23 -0000</pubDate><guid>https://sourceforge.net20c4748c6413b7c57854bced060e974f6efc335f</guid></item></channel></rss>