public inbox for fortran@gcc.gnu.org
 help / color / mirror / Atom feed
From: Lipeng Zhu <lipeng.zhu@intel.com>
To: Vaseeharan Vinayagamoorthy <Vaseeharan.Vinayagamoorthy@arm.com>,
	"jakub@redhat.com" <jakub@redhat.com>
Cc: "fortran@gcc.gnu.org" <fortran@gcc.gnu.org>,
	"gcc-patches@gcc.gnu.org" <gcc-patches@gcc.gnu.org>,
	"hongjiu.lu@intel.com" <hongjiu.lu@intel.com>,
	"pan.deng@intel.com" <pan.deng@intel.com>,
	"rep.dot.nop@gmail.com" <rep.dot.nop@gmail.com>,
	"tianyou.li@intel.com" <tianyou.li@intel.com>,
	"tkoenig@netcologne.de" <tkoenig@netcologne.de>,
	"wangyang.guo@intel.com" <wangyang.guo@intel.com>,
	Richard Earnshaw <Richard.Earnshaw@foss.arm.com>,
	Richard Earnshaw <Richard.Earnshaw@arm.com>
Subject: Re: [PATCH v7] libgfortran: Replace mutex with rwlock
Date: Wed, 3 Jan 2024 09:02:12 +0800	[thread overview]
Message-ID: <ff489de2-a50e-424b-a5f3-d220079c703a@intel.com> (raw)
In-Reply-To: <DB9PR08MB6474ED87B3E74C094003A1348161A@DB9PR08MB6474.eurprd08.prod.outlook.com>



On 2024/1/2 11:57, Vaseeharan Vinayagamoorthy wrote:
> Hi Lipeng,
> 
> It looks like your draft patch to fix the builds for arm-none-eabi target is not merged yet, because our arm-none-eabi builds are still broken. Are you waiting for additional information, or would you be able to fix this issue?
> 
> Kind regards,
> Vasee

Hi Vasee,

Actually I already sent a patch 
https://inbox.sourceware.org/gcc-patches/20231222023605.3894839-1-lipeng.zhu@intel.com/ 
to fix the build failure issue, now it is waiting for community to review.

Lipeng Zhu
> ________________________________
> From: Richard Earnshaw <Richard.Earnshaw@foss.arm.com>
> Sent: 15 December 2023 19:23
> To: Lipeng Zhu <lipeng.zhu@intel.com>; Richard Earnshaw <Richard.Earnshaw@arm.com>; jakub@redhat.com <jakub@redhat.com>
> Cc: fortran@gcc.gnu.org <fortran@gcc.gnu.org>; gcc-patches@gcc.gnu.org <gcc-patches@gcc.gnu.org>; hongjiu.lu@intel.com <hongjiu.lu@intel.com>; pan.deng@intel.com <pan.deng@intel.com>; rep.dot.nop@gmail.com <rep.dot.nop@gmail.com>; tianyou.li@intel.com <tianyou.li@intel.com>; tkoenig@netcologne.de <tkoenig@netcologne.de>; wangyang.guo@intel.com <wangyang.guo@intel.com>
> Subject: Re: [PATCH v7] libgfortran: Replace mutex with rwlock
> 
> 
> 
> On 15/12/2023 11:31, Lipeng Zhu wrote:
>>
>>
>> On 2023/12/14 23:50, Richard Earnshaw (lists) wrote:
>>> On 09/12/2023 15:39, Lipeng Zhu wrote:
>>>> This patch try to introduce the rwlock and split the read/write to
>>>> unit_root tree and unit_cache with rwlock instead of the mutex to
>>>> increase CPU efficiency. In the get_gfc_unit function, the percentage
>>>> to step into the insert_unit function is around 30%, in most instances,
>>>> we can get the unit in the phase of reading the unit_cache or unit_root
>>>> tree. So split the read/write phase by rwlock would be an approach to
>>>> make it more parallel.
>>>>
>>>> BTW, the IPC metrics can gain around 9x in our test
>>>> server with 220 cores. The benchmark we used is
>>>> https://github.com/rwesson/NEAT
>>>>
>>>> libgcc/ChangeLog:
>>>>
>>>>      * gthr-posix.h (__GTHREAD_RWLOCK_INIT): New macro.
>>>>      (__gthrw): New function.
>>>>      (__gthread_rwlock_rdlock): New function.
>>>>      (__gthread_rwlock_tryrdlock): New function.
>>>>      (__gthread_rwlock_wrlock): New function.
>>>>      (__gthread_rwlock_trywrlock): New function.
>>>>      (__gthread_rwlock_unlock): New function.
>>>>
>>>> libgfortran/ChangeLog:
>>>>
>>>>      * io/async.c (DEBUG_LINE): New macro.
>>>>      * io/async.h (RWLOCK_DEBUG_ADD): New macro.
>>>>      (CHECK_RDLOCK): New macro.
>>>>      (CHECK_WRLOCK): New macro.
>>>>      (TAIL_RWLOCK_DEBUG_QUEUE): New macro.
>>>>      (IN_RWLOCK_DEBUG_QUEUE): New macro.
>>>>      (RDLOCK): New macro.
>>>>      (WRLOCK): New macro.
>>>>      (RWUNLOCK): New macro.
>>>>      (RD_TO_WRLOCK): New macro.
>>>>      (INTERN_RDLOCK): New macro.
>>>>      (INTERN_WRLOCK): New macro.
>>>>      (INTERN_RWUNLOCK): New macro.
>>>>      * io/io.h (struct gfc_unit): Change UNIT_LOCK to UNIT_RWLOCK in
>>>>      a comment.
>>>>      (unit_lock): Remove including associated internal_proto.
>>>>      (unit_rwlock): New declarations including associated internal_proto.
>>>>      (dec_waiting_unlocked): Use WRLOCK and RWUNLOCK on unit_rwlock
>>>>      instead of __gthread_mutex_lock and __gthread_mutex_unlock on
>>>>      unit_lock.
>>>>      * io/transfer.c (st_read_done_worker): Use WRLOCK and RWUNLOCK on
>>>>      unit_rwlock instead of LOCK and UNLOCK on unit_lock.
>>>>      (st_write_done_worker): Likewise.
>>>>      * io/unit.c: Change UNIT_LOCK to UNIT_RWLOCK in 'IO locking rules'
>>>>      comment. Use unit_rwlock variable instead of unit_lock variable.
>>>>      (get_gfc_unit_from_unit_root): New function.
>>>>      (get_gfc_unit): Use RDLOCK, WRLOCK and RWUNLOCK on unit_rwlock
>>>>      instead of LOCK and UNLOCK on unit_lock.
>>>>      (close_unit_1): Use WRLOCK and RWUNLOCK on unit_rwlock instead of
>>>>      LOCK and UNLOCK on unit_lock.
>>>>      (close_units): Likewise.
>>>>      (newunit_alloc): Use RWUNLOCK on unit_rwlock instead of UNLOCK on
>>>>      unit_lock.
>>>>      * io/unix.c (find_file): Use RDLOCK and RWUNLOCK on unit_rwlock
>>>>      instead of LOCK and UNLOCK on unit_lock.
>>>>      (flush_all_units): Use WRLOCK and RWUNLOCK on unit_rwlock instead
>>>>      of LOCK and UNLOCK on unit_lock.
>>>>
>>>
>>> It looks like this has broken builds on arm-none-eabi when using newlib:
>>>
>>> In file included from
>>> /work/rearnsha/gnusrc/nightly/gcc-cross/master/libgfortran
>>> /runtime/error.c:27:
>>> /work/rearnsha/gnusrc/nightly/gcc-cross/master/libgfortran/io/io.h: In
>>> function
>>> ‘dec_waiting_unlocked’:
>>> /work/rearnsha/gnusrc/nightly/gcc-cross/master/libgfortran/io/io.h:1023:3: error
>>> : implicit declaration of function ‘WRLOCK’
>>> [-Wimplicit-function-declaration]
>>>    1023 |   WRLOCK (&unit_rwlock);
>>>         |   ^~~~~~
>>> /work/rearnsha/gnusrc/nightly/gcc-cross/master/libgfortran/io/io.h:1025:3: error
>>> : implicit declaration of function ‘RWUNLOCK’
>>> [-Wimplicit-function-declaration]
>>>    1025 |   RWUNLOCK (&unit_rwlock);
>>>         |   ^~~~~~~~
>>>
>>>
>>> R.
>>
>> Hi Richard,
>>
>> The root cause is that the macro WRLOCK and RWUNLOCK are not defined in
>> io.h. The reason of x86 platform not failed is that
>> HAVE_ATOMIC_FETCH_ADD is defined then caused above macros were never
>> been used. Code logic show as below:
>> #ifdef HAVE_ATOMIC_FETCH_ADD
>>     (void) __atomic_fetch_add (&u->waiting, -1, __ATOMIC_RELAXED);
>> #else
>>     WRLOCK (&unit_rwlock);
>>     u->waiting--;
>>     RWUNLOCK (&unit_rwlock);
>> #endif
>>
>> I just draft a patch try to fix this bug, because I didn't have arm
>> platform, would you help to validate if it was fixed on arm platform?
>>
>> diff --git a/libgfortran/io/io.h b/libgfortran/io/io.h
>> index 15daa0995b1..c7f0f7d7d9e 100644
>> --- a/libgfortran/io/io.h
>> +++ b/libgfortran/io/io.h
>> @@ -1020,9 +1020,15 @@ dec_waiting_unlocked (gfc_unit *u)
>>    #ifdef HAVE_ATOMIC_FETCH_ADD
>>      (void) __atomic_fetch_add (&u->waiting, -1, __ATOMIC_RELAXED);
>>    #else
>> -  WRLOCK (&unit_rwlock);
>> +#ifdef __GTHREAD_RWLOCK_INIT
>> +  __gthread_rwlock_wrlock (&unit_rwlock);
>> +  u->waiting--;
>> +  __gthread_rwlock_unlock (&unit_rwlock);
>> +#else
>> +  __gthread_mutex_lock (&unit_rwlock);
>>      u->waiting--;
>> -  RWUNLOCK (&unit_rwlock);
>> +  __gthread_mutex_unlock (&unit_rwlock);
>> +#endif
>>    #endif
>>    }
>>
>>
>> Lipeng Zhu
> 
> Hi Lipeng,
> 
> Thanks for the quick reply.  I can confirm that with the above change
> the bootstrap failure is fixed.  However, this shouldn't be considered a
> formal review; libgfortran is not really my area.
> 
> I'll be away now until January 2nd.
> 
> Richard.
> 

      reply	other threads:[~2024-01-03  1:02 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-05-09  2:32 [PATCH v4] " Zhu, Lipeng
2023-05-16  7:08 ` Zhu, Lipeng
2023-05-23  2:53   ` Zhu, Lipeng
2023-05-24 19:18     ` Thomas Koenig
2023-08-18  3:06       ` Zhu, Lipeng
2023-09-14  8:33         ` Zhu, Lipeng
2023-10-23  1:21           ` Zhu, Lipeng
2023-10-23  5:52             ` Thomas Koenig
2023-10-23 23:59               ` Zhu, Lipeng
2023-11-01 10:14                 ` Zhu, Lipeng
2023-11-02  9:58                   ` Bernhard Reutner-Fischer
2023-11-23  9:36                     ` Zhu, Lipeng
2023-12-07  5:18                       ` Zhu, Lipeng
2023-08-18  3:18       ` [PATCH v6] " Zhu, Lipeng
2023-12-08 10:19         ` Jakub Jelinek
2023-12-09 15:13           ` Zhu, Lipeng
2023-12-09 15:39             ` [PATCH v7] " Lipeng Zhu
2023-12-09 15:23               ` Jakub Jelinek
2023-12-10  3:25                 ` Zhu, Lipeng
2023-12-11 17:45                   ` H.J. Lu
2023-12-12  2:05                     ` Zhu, Lipeng
2023-12-13 20:52                       ` Thomas Schwinge
2023-12-14  2:28                         ` Zhu, Lipeng
2023-12-14 12:29                           ` Thomas Schwinge
2023-12-14 12:39                             ` Jakub Jelinek
2023-12-15  5:43                               ` Zhu, Lipeng
2023-12-21 11:42                         ` Thomas Schwinge
2023-12-22  6:48                           ` Lipeng Zhu
2024-01-03  9:14                           ` Lipeng Zhu
2024-01-17 13:25                             ` Lipeng Zhu
2023-12-14 15:50               ` Richard Earnshaw (lists)
2023-12-15 11:31                 ` Lipeng Zhu
2023-12-15 19:23                   ` Richard Earnshaw
2024-01-02 11:57                     ` Vaseeharan Vinayagamoorthy
2024-01-03  1:02                       ` Lipeng Zhu [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ff489de2-a50e-424b-a5f3-d220079c703a@intel.com \
    --to=lipeng.zhu@intel.com \
    --cc=Richard.Earnshaw@arm.com \
    --cc=Richard.Earnshaw@foss.arm.com \
    --cc=Vaseeharan.Vinayagamoorthy@arm.com \
    --cc=fortran@gcc.gnu.org \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=hongjiu.lu@intel.com \
    --cc=jakub@redhat.com \
    --cc=pan.deng@intel.com \
    --cc=rep.dot.nop@gmail.com \
    --cc=tianyou.li@intel.com \
    --cc=tkoenig@netcologne.de \
    --cc=wangyang.guo@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).