prefetch instructions in Hotspot

Mahmood Naderan nt_mahmood at yahoo.com
Wed Apr 2 12:59:40 UTC 2014


Vlad,
I added the decelerations and can be verified as below

mahmood at orca:~$ grep -r "public native" /usr/lib/jvm/java-6-openjdk-amd64/sun/misc/Unsafe.java
    public native void prefetchRead (Object o, long offset);
    public native void prefetchWrite(Object o, long offset);
    public native int getInt(Object o, long offset);
    public native void putInt(Object o, long offset, int x);
    public native Object getObject(Object o, long offset);
    public native void putObject(Object o, long offset, Object x);
    public native boolean getBoolean(Object o, long offset);
    public native void    putBoolean(Object o, long offset, boolean x);
    public native byte    getByte(Object o, long offset);
    public native void    putByte(Object o, long offset, byte x);
    public native short   getShort(Object o, long offset);
    public native void    putShort(Object o, long offset, short x);
    public native char    getChar(Object o, long offset);
    public native void    putChar(Object o, long offset, char x);
    public native long    getLong(Object o, long offset);
    public native void    putLong(Object o, long offset, long x);
    public native float   getFloat(Object o, long offset);
    public native void    putFloat(Object o, long offset, float x);
    public native double  getDouble(Object o, long offset);
    public native void    putDouble(Object o, long offset, double x);
    public native byte    getByte(long address);
    public native void    putByte(long address, byte x);
    public native short   getShort(long address);
    public native void    putShort(long address, short x);
    public native char    getChar(long address);
    public native void    putChar(long address, char x);
    public native int     getInt(long address);
    public native void    putInt(long address, int x);
    public native long    getLong(long address);
    public native void    putLong(long address, long x);
    public native float   getFloat(long address);
    public native void    putFloat(long address, float x);
    public native double  getDouble(long address);
    public native void    putDouble(long address, double x);
    public native long getAddress(long address);
    public native void putAddress(long address, long x);
    public native long allocateMemory(long bytes);
    public native long reallocateMemory(long address, long bytes);
    public native void setMemory(long address, long bytes, byte value);
    public native void copyMemory(Object srcBase, long srcOffset,
    public native void freeMemory(long address);
    public native long staticFieldOffset(Field f);
    public native long objectFieldOffset(Field f);
    public native Object staticFieldBase(Field f);
    public native void ensureClassInitialized(Class c);
    public native int arrayBaseOffset(Class arrayClass);
    public native int arrayIndexScale(Class arrayClass);
    public native int addressSize();
    public native int pageSize();
    public native Class defineClass(String name, byte[] b, int off, int len,
    public native Class defineClass(String name, byte[] b, int off, int len);
    public native Object allocateInstance(Class cls)
    public native void monitorEnter(Object o);
    public native void monitorExit(Object o);
    public native boolean tryMonitorEnter(Object o);
    public native void throwException(Throwable ee);
    public native Object getObjectVolatile(Object o, long offset);
    public native void    putObjectVolatile(Object o, long offset, Object x);
    public native int     getIntVolatile(Object o, long offset);
    public native void    putIntVolatile(Object o, long offset, int x);
    public native boolean getBooleanVolatile(Object o, long offset);
    public native void    putBooleanVolatile(Object o, long offset, boolean x);
    public native byte    getByteVolatile(Object o, long offset);
    public native void    putByteVolatile(Object o, long offset, byte x);
    public native short   getShortVolatile(Object o, long offset);
    public native void    putShortVolatile(Object o, long offset, short x);
    public native char    getCharVolatile(Object o, long offset);
    public native void    putCharVolatile(Object o, long offset, char x);
    public native long    getLongVolatile(Object o, long offset);
    public native void    putLongVolatile(Object o, long offset, long x);
    public native float   getFloatVolatile(Object o, long offset);
    public native void    putFloatVolatile(Object o, long offset, float x);
    public native double  getDoubleVolatile(Object o, long offset);
    public native void    putDoubleVolatile(Object o, long offset, double x);
    public native void    putOrderedObject(Object o, long offset, Object x);
    public native void    putOrderedInt(Object o, long offset, int x);
    public native void    putOrderedLong(Object o, long offset, long x);
    public native void unpark(Object thread);
    public native void park(boolean isAbsolute, long time);
    public native int getLoadAverage(double[] loadavg, int nelems);

mahmood at orca:~$ grep -r "public static" /usr/lib/jvm/java-6-openjdk-amd64/sun/misc/Unsafe.java
    public static native void prefetchReadStatic (Object o, long offset);
    public static native void prefetchWriteStatic(Object o, long offset);
    public static Unsafe getUnsafe() {
    public static final int INVALID_FIELD_OFFSET   = -1;
 

 

But there is no library_call.cpp in /usr/lib/jvm/java-6-openjdk-amd64



Regards,
Mahmood
On Monday, March 31, 2014 11:58 PM, Vladimir Kozlov <vladimir.kozlov at oracle.com> wrote:
 
Hi Mahmood

You don't need anything additional if you can build and execute java from sources you have.

Do you want to use readPrefetch from java code?
If yes, you need to add declarations into jdk/src/share/classessun/misc/Unsafe.java:

     public native void prefetchRead (Object o, long offset);
     public native void prefetchWrite(Object o, long offset);
     public static native void prefetchReadStatic (Object o, long offset);
     public static native void prefetchWriteStatic(Object o, long offset);

And we already have corresponding intrinsics in Hotspot:

hotspot/src/share/vm/opto/library_call.cpp
LibraryCallKit::inline_unsafe_prefetch()

Regards,
Vladimir



On 3/31/14 5:38 AM, Mahmood Naderan wrote:
> Hi,
>
> I have some naive questions so any answer to the following questions are appreciated.
>
> 1- I have open-jdk 1.6 and 1.7. Do I have to install additional things?
>
> 2- I want to use some intrinsics (readPrefetch) but there are little information on how to use the intrinsics. Is there any example for that? The only thing I see is https://bugs.openjdk.java.net/browse/JDK-2146656
>
>
> Regards,
> Mahmood
>


More information about the hotspot-dev mailing list