Ok, thanks. Makes sense. xiaofeng
On 5/24/07, Mikhail Fursov <[EMAIL PROTECTED]> wrote:
Xiao-Feng,
Jitrino on IA32 platform splits every 64-bit integer into two 32-bit values
and every store/load of 64bit integer is done with 2 separate store/loads of
32-bit ones.Before using locks we must have single 64bit store/load
instruction. When we have it - lock prefix won't be needed at all (AFAIU)
You point about compatibility with no-SSE platform is good. George, what do
you think about FISTP to store 64-bit integers to memory?
On 5/23/07, Xiao-Feng Li <[EMAIL PROTECTED]> wrote:
>
> On 5/23/07, Mikhail Fursov <[EMAIL PROTECTED]> wrote:
> > On 5/23/07, Xiao-Feng Li <[EMAIL PROTECTED]> wrote:
> > >
> > > I had a question in the JIRA about this issue: why don't we use "lock"
> > > prefix for the atomic access?
> >
> >
> > Lock prefix will cause significant performance degradation. For example,
> > some time ago, when our monenter implementation always used locks the
> > inlining of this helper gave no benefit at all. The removal of lock
> without
> > inlining gave a real benefit but was illegal.
>
> Mikhail, actually I was working on synchronization for a pretty long
> time, so the "lock" prefix implication to performance is well
> understood. In my understanding, volatile long is quite different from
> Java monitor. I personally don't believe that to use "lock" prefix for
> volatile long can cause any visible performance issue in real
> workloads, if it doesn't bring performance improvement. (Probably JIT
> can do a good job here to optimize the excessive "lock" prefixes if
> the volatile long variable really shows performance issue, although
> it's unlikely to happen in real workloads.)
>
> My concern is the 8-byte object alignment requirement if we use
> current solution. It requires to change the class loader and object
> arrangement in heap. For example, do we have any performance study on
> its implication to SPECs? Probably the 8-byte alignment would
> ultimately be needed for Harmony, but there is a methodology issue
> here: Currently the problem with volatile long is its correctness,
> instead of its performance. We don't need consider too much about the
> performance issue if we can achieve the correctness relatively
> trivially and quickly (by simply emitting a "lock" prefix). Then we
> can check if the performance is indeed an issue. We still keep the
> optimization opportunities, and it's not late to implement current
> solution after we have a good understanding in the issue.
>
> These are just my cents, for your reference. :-)
>
> > AFAIK we do not have problems with volatile int32/int16/int8 types today
> on
> > 32bit PC. If this is true we can try to handle int64 values using 64bit
> > registers without locks too.
>
> Yes, as I described above, it's good to have the try, but we need
> consider more. For example, do we know if it will introduce any
> portability issue?
>
> Thanks,
> xiaofeng
>
> >
> >
> > Thanks,
> > > xiaofeng
> > >
> > > On 5/23/07, George Timoshenko (JIRA) < [EMAIL PROTECTED]> wrote:
> > > >
> > > > [
>
https://issues.apache.org/jira/browse/HARMONY-2092?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
> > > ]
> > > >
> > > > George Timoshenko updated HARMONY-2092:
> > > > ---------------------------------------
> > > >
> > > > Attachment: HARMONY-2092-regression_test.patch
> > > >
> > > > regression test
> > > > based on the testcase by Mikhail Fursov
> > > >
> > > > > [drlvm][jit] Harmony works with volatile variables incorrectly
> > > > > --------------------------------------------------------------
> > > > >
> > > > > Key: HARMONY-2092
> > > > > URL:
> > > https://issues.apache.org/jira/browse/HARMONY-2092
> > > > > Project: Harmony
> > > > > Issue Type: Bug
> > > > > Components: DRLVM
> > > > > Environment: Windows and Linux
> > > > > Reporter: Vera Petrashkova
> > > > > Assigned To: weldon washburn
> > > > > Attachments: classloader_and_gc_quick_fix.diff,
> > > HARMONY-2092-regression_test.patch, HARMONY-2092.patch,
> volatileTest.zip
> > > > >
> > > > >
> > > > > When Long_MAX_VALUE or Long.MIN_VALUE should be assigned to
> volatile
> > > variable then
> > > > > VM works incorrectly.
> > > > > Code for reproducing:
> > > > > ------------------volatileTest.java-----------------
> > > > > public class volatileTest {
> > > > > public static int delay = 5000;
> > > > > private boolean interruptFlag = false;
> > > > > long hi;
> > > > > long lo;
> > > > > volatile long v;
> > > > > public static void main(String [] args ) {
> > > > > int maxI = 20;
> > > > > for (int i = 0; i < maxI; i++) {
> > > > > int t = new volatileTest().test(delay);
> > > > > System.out.println((t == 104 ? "Test passed: ": "Test
> > > failed: ")
> > > > > + t + " (step: " + i + ")");
> > > > > }
> > > > > }
> > > > > public synchronized void interrupt() {
> > > > > interruptFlag = true;
> > > > > }
> > > > > public synchronized boolean interrupted() {
> > > > > return interruptFlag;
> > > > > }
> > > > > public volatileTest() {
> > > > > super();
> > > > > hi = Long.MAX_VALUE;
> > > > > lo = Long.MIN_VALUE;
> > > > > v = hi;
> > > > > }
> > > > > public int test(int delay) {
> > > > > boolean passed = true;
> > > > > Thread_1_class t1 = new Thread_1_class(this);
> > > > > Thread_2_class t2 = new Thread_2_class(this);
> > > > > Interruptor killer = new Interruptor(this, delay);
> > > > > try {
> > > > > t1.start();
> > > > > t2.start();
> > > > > killer.start();
> > > > >
> > > > > while (!interrupted()) {
> > > > > Thread.yield();
> > > > > long v3 = v;
> > > > > if (v3 != hi && v3 != lo) {
> > > > > System.out.println(v3+" "+hi +" "+lo);
> > > > > passed = false;
> > > > > break;
> > > > > }
> > > > > }
> > > > > t1.interrupt();
> > > > > t2.interrupt();
> > > > > return passed ? 104 : 105;
> > > > > } catch (Throwable e) {
> > > > > e.printStackTrace();
> > > > > return 106;
> > > > > }
> > > > > }
> > > > > }
> > > > > class Thread_1_class extends Thread {
> > > > > volatileTest thh;
> > > > > public Thread_1_class (volatileTest t) {
> > > > > super();
> > > > > thh = t;
> > > > > }
> > > > > public void run() {
> > > > > while (!isInterrupted()) {
> > > > > thh.v = thh.lo;
> > > > > thh.v = thh.hi;
> > > > > }
> > > > > }
> > > > > }
> > > > > class Thread_2_class extends Thread {
> > > > > volatileTest thh;
> > > > > public Thread_2_class (volatileTest t) {
> > > > > super();
> > > > > thh = t;
> > > > > }
> > > > > public void run() {
> > > > > while (!isInterrupted()) {
> > > > > thh.v = thh.hi;
> > > > > thh.v = thh.lo;
> > > > > }
> > > > > }
> > > > > }
> > > > > class Interruptor extends Thread {
> > > > > volatileTest t;
> > > > > int delay;
> > > > > public Interruptor(volatileTest t, int delay) {
> > > > > this.t = t;
> > > > > this.delay = delay;
> > > > > }
> > > > > public void run() {
> > > > > try {
> > > > > Thread.sleep(delay);
> > > > > } catch (InterruptedException e) {
> > > > > }
> > > > > t.interrupt();
> > > > > }
> > > > > }
> > > > > ----------------------------
> > > > > Output on RI:
> > > > > ================
> > > > > java version " 1.5.0_06"
> > > > > Java(TM) 2 Runtime Environment, Standard Edition (build
> 1.5.0_06-b05)
> > > > > Java HotSpot(TM) Client VM (build 1.5.0_06-b05, mixed mode)
> > > > > Test passed: 104 (step: 0)
> > > > > Test passed: 104 (step: 1)
> > > > > Test passed: 104 (step: 2)
> > > > > Test passed: 104 (step: 3)
> > > > > Test passed: 104 (step: 4)
> > > > > Test passed: 104 (step: 5)
> > > > > Test passed: 104 (step: 6)
> > > > > Test passed: 104 (step: 7)
> > > > > Test passed: 104 (step: 8)
> > > > > Test passed: 104 (step: 9)
> > > > > Test passed: 104 (step: 10)
> > > > > Test passed: 104 (step: 11)
> > > > > Test passed: 104 (step: 12)
> > > > > Test passed: 104 (step: 13)
> > > > > Test passed: 104 (step: 14)
> > > > > Test passed: 104 (step: 15)
> > > > > Test passed: 104 (step: 16)
> > > > > Test passed: 104 (step: 17)
> > > > > Test passed: 104 (step: 18)
> > > > > Test passed: 104 (step: 19)
> > > > > Output on Harmony:
> > > > > ====================
> > > > > Apache Harmony Launcher : (c) Copyright 1991, 2006 The Apache
> Software
> > > Foundation or its licensors, as applicable.
> > > > > java version " 1.5.0"
> > > > > pre-alpha : not complete or compatible
> > > > > svn = r471468, (Nov 7 2006), Windows/ia32/msvc 1310, release
> build
> > > > > http://incubator.apache.org/harmony
> > > > > Test passed: 104 (step: 0)
> > > > > Test passed: 104 (step: 1)
> > > > > Test passed: 104 (step: 2)
> > > > > Test passed: 104 (step: 3)
> > > > > Test passed: 104 (step: 4)
> > > > > Test passed: 104 (step: 5)
> > > > > Test passed: 104 (step: 6)
> > > > > Test passed: 104 (step: 7)
> > > > > Test passed: 104 (step: 8)
> > > > > Test passed: 104 (step: 9)
> > > > > Test passed: 104 (step: 10)
> > > > > 9223372032559808512 9223372036854775807 -9223372036854775808
> > > > > Test failed: 105 (step: 11)
> > > > > Test passed: 104 (step: 12)
> > > > > 9223372032559808512 9223372036854775807 -9223372036854775808
> > > > > Test failed: 105 (step: 13)
> > > > > Test passed: 104 (step: 14)
> > > > > Test passed: 104 (step: 15)
> > > > > -9223372032559808513 9223372036854775807 -9223372036854775808
> > > > > Test failed: 105 (step: 16)
> > > > > -9223372032559808513 9223372036854775807 -9223372036854775808
> > > > > Test failed: 105 (step: 17)
> > > > > Test passed: 104 (step: 18)
> > > > > Test passed: 104 (step: 19)
> > > > > Apache Harmony Launcher : (c) Copyright 1991, 2006 The Apache
> Software
> > > Foundation or its licensors, as applicable.
> > > > > java version "1.5.0"
> > > > > pre-alpha : not complete or compatible
> > > > > svn = r471468, (Nov 7 2006), Linux/ia32/gcc 3.3.3, release build
> > > > > http://incubator.apache.org/harmony
> > > > > -9223372032559808513 9223372036854775807 -9223372036854775808
> > > > > Test failed: 105 (step: 0)
> > > > > 9223372032559808512 9223372036854775807 -9223372036854775808
> > > > > Test failed: 105 (step: 1)
> > > > > 9223372032559808512 9223372036854775807 -9223372036854775808
> > > > > Test failed: 105 (step: 2)
> > > > > 9223372032559808512 9223372036854775807 -9223372036854775808
> > > > > Test failed: 105 (step: 3)
> > > > > 9223372032559808512 9223372036854775807 -9223372036854775808
> > > > > Test failed: 105 (step: 4)
> > > > > -9223372032559808513 9223372036854775807 -9223372036854775808
> > > > > Test failed: 105 (step: 5)
> > > > > 9223372032559808512 9223372036854775807 -9223372036854775808
> > > > > Test failed: 105 (step: 6)
> > > > > 9223372032559808512 9223372036854775807 -9223372036854775808
> > > > > Test failed: 105 (step: 7)
> > > > > -9223372032559808513 9223372036854775807 -9223372036854775808
> > > > > Test failed: 105 (step: 8)
> > > > > 9223372032559808512 9223372036854775807 -9223372036854775808
> > > > > Test failed: 105 (step: 9)
> > > > > 9223372032559808512 9223372036854775807 -9223372036854775808
> > > > > Test failed: 105 (step: 10)
> > > > > -9223372032559808513 9223372036854775807 -9223372036854775808
> > > > > Test failed: 105 (step: 11)
> > > > > -9223372032559808513 9223372036854775807 -9223372036854775808
> > > > > Test failed: 105 (step: 12)
> > > > > 9223372032559808512 9223372036854775807 -9223372036854775808
> > > > > Test failed: 105 (step: 13)
> > > > > -9223372032559808513 9223372036854775807 -9223372036854775808
> > > > > Test failed: 105 (step: 14)
> > > > > -9223372032559808513 9223372036854775807 -9223372036854775808
> > > > > Test failed: 105 (step: 15)
> > > > > 9223372032559808512 9223372036854775807 -9223372036854775808
> > > > > Test failed: 105 (step: 16)
> > > > > 9223372032559808512 9223372036854775807 -9223372036854775808
> > > > > Test failed: 105 (step: 17)
> > > > > -9223372032559808513 9223372036854775807 -9223372036854775808
> > > > > Test failed: 105 (step: 18)
> > > > > 9223372032559808512 9223372036854775807 -9223372036854775808
> > > > > Test failed: 105 (step: 19)
> > > > > This bug is reproducible on Jitrino (JET/OPT) and on interpreter:
> > > > > java -cp . volatileTest
> > > > > java -cp . -Xint volatileTest
> > > > > java -cp . -Xem:opt volatileTest
> > > >
> > > > --
> > > > This message is automatically generated by JIRA.
> > > > -
> > > > You can reply to this email to add a comment to the issue online.
> > > >
> > > >
> > >
> > >
> > > --
> > > http://xiao-feng.blogspot.com
> > >
> >
> >
> >
> > --
> > Mikhail Fursov
> >
>
>
> --
> http://xiao-feng.blogspot.com
>
--
Mikhail Fursov
--
http://xiao-feng.blogspot.com