From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=unavailable autolearn_force=no version=3.4.4 Path: eternal-september.org!reader01.eternal-september.org!reader02.eternal-september.org!news.eternal-september.org!news.eternal-september.org!feeder.eternal-september.org!aioe.org!.POSTED!not-for-mail From: "Dmitry A. Kazakov" Newsgroups: comp.lang.ada Subject: Re: Portable memory barrier? Date: Mon, 8 May 2017 23:09:44 +0200 Organization: Aioe.org NNTP Server Message-ID: References: <0fc56bf7-1cfa-4776-9c47-a573db315c5f@googlegroups.com> <7b0c08eb-be62-4d14-ae99-cad038ad0a62@googlegroups.com> NNTP-Posting-Host: BYuA7L7MRjuLLjcoGHOBxw.user.gioia.aioe.org Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit X-Complaints-To: abuse@aioe.org User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Thunderbird/45.8.0 X-Notice: Filtered by postfilter v. 0.8.2 Xref: news.eternal-september.org comp.lang.ada:46711 Date: 2017-05-08T23:09:44+02:00 List-Id: On 2017-05-08 21:18, Robert Eachus wrote: > So the CPU can, and normally will, move the counter update before > the data write. The CPU wants to merge two writes to the same cache line > when possible. Obviously, it won't wait for another write of the counter > or buffer, but if they are present in the reorder buffers, the CPU will > do what it can to merge them. (The first one goes into the write pipe, > but the CPU noticed that it will need that value for the associated data > write. So it pulls a copy out of the write buffer, while leaving the > original write in place. If the next update becomes available while the > index is still in the write pipe, the CPU will cancel the original > write, or change the value to be written. (Depends on the particular > hardware. Also the CPUs may keep a copy in a renamed register, or it may > rely on the copy in the write pipe. Depends on the timing, and on the > size of the register.) This strategy does not prevent reordering writes: FIFO (Write_Index + 1) := Element; Write_Index := Write_Index + 1; into Write_Index := Write_Index + 1; FIFO (Write_Index) := Element; which would be a bug. -- Regards, Dmitry A. Kazakov http://www.dmitry-kazakov.de