Return-Path: Delivered-To: apmail-harmony-dev-archive@www.apache.org Received: (qmail 72053 invoked from network); 22 Apr 2007 16:19:54 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 22 Apr 2007 16:19:54 -0000 Received: (qmail 84941 invoked by uid 500); 22 Apr 2007 16:19:59 -0000 Delivered-To: apmail-harmony-dev-archive@harmony.apache.org Received: (qmail 84717 invoked by uid 500); 22 Apr 2007 16:19:58 -0000 Mailing-List: contact dev-help@harmony.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@harmony.apache.org Delivered-To: mailing list dev@harmony.apache.org Received: (qmail 84707 invoked by uid 99); 22 Apr 2007 16:19:58 -0000 Received: from herse.apache.org (HELO herse.apache.org) (140.211.11.133) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 22 Apr 2007 09:19:58 -0700 X-ASF-Spam-Status: No, hits=-0.0 required=10.0 tests=SPF_HELO_PASS,SPF_PASS X-Spam-Check-By: apache.org Received-SPF: pass (herse.apache.org: domain of gcjhd-harmony-dev@m.gmane.org designates 80.91.229.2 as permitted sender) Received: from [80.91.229.2] (HELO ciao.gmane.org) (80.91.229.2) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 22 Apr 2007 09:19:48 -0700 Received: from list by ciao.gmane.org with local (Exim 4.43) id 1Hfemc-0006r9-0B for dev@harmony.apache.org; Sun, 22 Apr 2007 18:19:26 +0200 Received: from iswfwpr01.isw.intel.com ([192.55.37.193]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Sun, 22 Apr 2007 18:19:25 +0200 Received: from gshimansky by iswfwpr01.isw.intel.com with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Sun, 22 Apr 2007 18:19:25 +0200 X-Injected-Via-Gmane: http://gmane.org/ To: dev@harmony.apache.org From: Gregory Shimansky Subject: Re: [drlvm] Another mfence operation??? fast_thread_array??? Date: Sun, 22 Apr 2007 20:19:15 +0400 Lines: 232 Message-ID: References: <3b3f27c60704172203n5234bb77h1ca067fa1be87752@mail.gmail.com> <3b3f27c60704172242k66778658x211331e3e0a05df3@mail.gmail.com> <51d555c70704201748p577de077md90feebf5393c048@mail.gmail.com> <3b3f27c60704201824o4a3b9598u84e8da4c85246ec7@mail.gmail.com> <51d555c70704201903v5796d358y26303fb5d1009882@mail.gmail.com> <3b3f27c60704201923l43ee5celaae5381a523eb604@mail.gmail.com> <51d555c70704201955r61a46494mcfca5228c4fe85a9@mail.gmail.com> <3b3f27c60704212051g11332651lca7f36469fb21212@mail.gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Complaints-To: usenet@sea.gmane.org X-Gmane-NNTP-Posting-Host: iswfwpr01.isw.intel.com User-Agent: Thunderbird 2.0.0.0 (Windows/20070326) In-Reply-To: <3b3f27c60704212051g11332651lca7f36469fb21212@mail.gmail.com> Sender: news X-Virus-Checked: Checked by ClamAV on apache.org Nathan Beyer wrote: > Rana, > You mentioned that VS2005 doesn't support inline assembly, but based > on this reference [1], it seems like it's still supported? Rana didn't write quite correctly. MSVC 2005 supports inline assembly in 32-bit compilation mode only, just line MSVC 2003 does. For x86_64 target there is no inline assembly. > [1] http://msdn2.microsoft.com/en-us/library/45yd4tzz(VS.80).aspx > > On 4/20/07, Rana Dasgupta wrote: >> Thanks much Nathan. >> >> On 4/20/07, Nathan Beyer wrote: >> > Okay, it's clear as mud now! :) Thanks. >> > >> > I'll patch this in now. >> > >> > -Nathan >> > >> > On 4/20/07, Rana Dasgupta wrote: >> > > On 4/20/07, Nathan Beyer wrote: >> > > > I agree that we need to add the lock as well on windows. BTW - the >> > > > locking for RW barriers was pulled from this document [1]. The lock >> > > > instruction seemed the best of the three options; use mfence >> (not an >> > > > option), use no-op lock or cpuid, which is apparently very slow. >> > > >> > > Yes, I agree this is the safest if you really want a real read write >> > > barrier that can be used anywhere, with least common denominator code >> > > on x86, using a single binary image. But the penalty needs to be the >> > > same on Windows and Linux. >> > > > >> > > > Another option would be looking at the operation just after the >> > > > barrier; according to this [1], any lock-prefixed instruction will >> > > > work on x86, so instead of a lock and wasted instruction, we could >> > > > lock with the next instruction. Though, this may only be >> something a >> > > > JIT would do. >> > > >> > > Not all instructions can take the lock prefix that causes an >> assert on >> > > the bus, which is what you need for the instruction to serialize, so >> > > this "may" not always work. >> > > > >> > > > What does the EM64T mean? >> > > > Isn't that just saying P4? I'm still not >> > > > quite clear on the differences between EM6T, IPF, x86_64/x64, etc? >> > > >> > > I agree, there are just too many acronyms that seem to be ever >> > > changing! EM64T here indicates 64 bit x86, also called AMD64 >> > > elsewhere, or x64. It does have a seperate binary for us, and for it >> > > we use the VS2005 compiler. (For reference, your Linux part of the >> > > patch seperates this out very nicely). Unfortunately, for VS2005, we >> > > can't do __asm{ mfence } etc. since Microsoft does not support inline >> > > assembly in this new compiler. So a seperate .asm file ( above ) is >> > > needed. The build file will have to be modified to assemble this( see >> > > other port/atomic/win etc. )directories, sorry I didn't add the build >> > > change. So the above code will use mfence only on EM64T ( as in Linux >> > > ) , but use the "lock add..." on all 32 bit x86 platforms. IPF ( >> also >> > > referred to as iA64 ) is Itanium, and we only support it on Linux >> > > where you use "asm volatile("mf:::memory" which is correct. We don't >> > > need to worry about it on Windows. >> > > >> > > >How >> > > > do these map to the builds? There's not a separate EM64T end state, >> > > > right? >> > > > >> > > > If that does just mean a P4, I don't think this code snippet is >> > > > correct, unless we're going to start separating our builds that >> way. >> > > > >> > > > [1] http://gee.cs.oswego.edu/dl/jmm/cookbook.html >> > > > >> > > > -Nathan >> > > > >> > > > On 4/20/07, Rana Dasgupta wrote: >> > > > > Nathan, >> > > > > I was going through your patch and had a small suggestion. >> We had >> > > > > discussed on other related threads that on Windows we wanted >> to use >> > > > > the MSVC provided _ReadWriteBarrier intrinsic and the patch >> does that, >> > > > > but this may not be enough. This generates no instruction, but >> is a >> > > > > compiler fence only. x86 does not need a store fence, but for >> smp the >> > > > > load fence can be certainly needed. >> > > > > That's the assumption on Linux where in >> apr_memory_rw_barrier() we >> > > > > insert both a compiler and an instruction fence, eg., >> > > > > >> > > > > apr_memory_rw_barrier() >> > > > > { >> > > > > ... >> > > > > #else >> > > > > asm volatile ("lock; addl $0, 0(%%esp)":::"memory"); >> > > > > ... >> > > > > } >> > > > > >> > > > > I agree that since there is no mfence on PIII, probably the >> dummy lock >> > > > > is the safest option for x86 wide code. But "lock" is expensive, >> > > > > specially for Pentium 4 , Centrino etc. which have the "mfence" >> > > > > instruction. And this penalty on current platforms is only on >> Linux. >> > > > > My suggestion is to do the same on Windows as well. If we need >> the >> > > > > real fence, we need it on both....So on Windows... >> > > > > >> > > > > On Windows in apr_thread_ext.c: >> > > > > ================================ >> > > > > #if _MSC_VER < 1400 >> > > > > extern void _ReadWriteBarrier(); >> > > > > #else >> > > > > #include >> > > > > #endif >> > > > > #pragma intrinsic (_ReadWriteBarrier) >> > > > > >> > > > > APR_DECLARE(void) apr_memory_rw_barrier(){ >> > > > > #ifdef _EM64T_ >> > > > > // create rwfence64() in asm file >> port\src\thread\win\rwfence.asm >> > > > > rwfence64(); >> > > > > #else >> > > > > __asm {lock add [esp], 0 } >> > > > > #endif >> > > > > _ReadWriteBarrier(); >> > > > > } >> > > > > >> > > > > In port\src\thread\win\rwfence.asm: >> > > > > =================================== >> > > > > PUBLIC rwfence64 >> > > > > >> > > > > _TEXT SEGMENT >> > > > > >> > > > > rwfence64 PROC >> > > > > >> > > > > mfence >> > > > > >> > > > > >> > > > > PROC ENDP >> > > > > TEXT ENDS >> > > > > >> > > > > What do you think? >> > > > > >> > > > > Thanks, >> > > > > Rana >> > > > > >> > > > > On 4/17/07, Nathan Beyer wrote: >> > > > > > I think I have this resolved with this commit [1]. I'm now >> able to run >> > > > > > DRLVM in interpreted mode on my Quad P3 ... at least a >> 'Hello World' >> > > > > > app. >> > > > > > >> > > > > > -Nathan >> > > > > > >> > > > > > [1] http://svn.apache.org/viewvc?view=rev&rev=529880 >> > > > > > >> > > > > > On 4/18/07, Nathan Beyer wrote: >> > > > > > > I've run into another SSE2 operation in DRLVM, this time >> it's in the >> > > > > > > hythr library, but I can't find the specific instance. >> According to >> > > > > > > GDB, it's happening in fast_thread_array() in libhythr.so. >> > > > > > > >> > > > > > > Is this from the 'apr_thread_ext.c' file? I'm going to >> attempt to >> > > > > > > modify this to be like the changes I made to the >> 'atomics.cpp', so >> > > > > > > that this can run on P3 (SSE) CPUs. >> > > > > > > >> > > > > > > >> nathan@pants:~/harmony/drlvm-trunk/build/lnx_ia32_gcc_debug/deploy/jdk/jre/bin$ >> >> > > > > > > ./java -Xint -cp /home/nathan/workspace/helloworld/bin >> HelloWorld >> > > > > > > Illegal instruction >> > > > > > > >> nathan@pants:~/harmony/drlvm-trunk/build/lnx_ia32_gcc_debug/deploy/jdk/jre/bin$ >> >> > > > > > > gdb --args ./java -Xint -cp >> /home/nathan/workspace/helloworld/bin >> > > > > > > HelloWorld >> > > > > > > GNU gdb 6.6-debian >> > > > > > > Copyright (C) 2006 Free Software Foundation, Inc. >> > > > > > > GDB is free software, covered by the GNU General Public >> License, and you are >> > > > > > > welcome to change it and/or distribute copies of it under >> certain conditions. >> > > > > > > Type "show copying" to see the conditions. >> > > > > > > There is absolutely no warranty for GDB. Type "show >> warranty" for details. >> > > > > > > This GDB was configured as "i486-linux-gnu"... >> > > > > > > Using host libthread_db library >> "/lib/tls/i686/cmov/libthread_db.so.1". >> > > > > > > (gdb) run >> > > > > > > Starting program: >> > > > > > > >> /home/nathan/harmony/drlvm-trunk/build/lnx_ia32_gcc_debug/deploy/jdk/jre/bin/java >> >> > > > > > > -Xint -cp /home/nathan/workspace/helloworld/bin HelloWorld >> > > > > > > [Thread debugging using libthread_db enabled] >> > > > > > > [New Thread -1214834000 (LWP 32414)] >> > > > > > > [New Thread -1215992944 (LWP 32417)] >> > > > > > > [New process 32414] >> > > > > > > [New LWP 32414] >> > > > > > > >> > > > > > > Program received signal SIGILL, Illegal instruction. >> > > > > > > 0xb7bc543f in fast_thread_array () >> > > > > > > from >> /home/nathan/harmony/drlvm-trunk/build/lnx_ia32_gcc_debug/deploy/jdk/jre/bin/libhythr.so >> >> > > > > > > (gdb) x/1i $eip >> > > > > > > 0xb7bc543f : mfence >> > > > > > > (gdb) >> > > > > > > >> > > > > > >> > > > > >> > > > >> > > >> > >> > -- Gregory