harmony-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Alexey Varlamov" <alexey.v.varla...@gmail.com>
Subject Re: svn commit: r596220 - in /harmony/enhanced/drlvm/trunk/vm/gc_gen/src: common/gc_common.cpp thread/gc_thread.h
Date Wed, 21 Nov 2007 06:00:03 GMT
Hi Xiao-Feng,

IPF build fails after this commit:

[cc] /tmp/ccdZauRF.s: Assembler messages:
[cc] /tmp/ccdZauRF.s:13690: Error: Unknown opcode `prefetchnta (r14)'

Please take a look.

Thanks,
Alexey

2007/11/19, xli@apache.org <xli@apache.org>:
> Author: xli
> Date: Mon Nov 19 00:16:50 2007
> New Revision: 596220
>
> URL: http://svn.apache.org/viewvc?rev=596220&view=rev
> Log:
> HARMONY-5146 : [drlvm][gc]Allocation Prefetch in Garbage Collector
>
> Modified:
>    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_common.cpp
>    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/thread/gc_thread.h
>
> Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_common.cpp
> URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_common.cpp?rev=596220&r1=596219&r2=596220&view=diff
> ==============================================================================
> --- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_common.cpp (original)
> +++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_common.cpp Mon Nov 19 00:16:50
2007
> @@ -62,6 +62,13 @@
>  extern Boolean IS_MOVE_COMPACT;
>  extern Boolean USE_CONCURRENT_GC;
>
> +#if defined(ALLOC_ZEROING) && defined(ALLOC_PREFETCH)
> +POINTER_SIZE_INT PREFETCH_DISTANCE = 1024;
> +POINTER_SIZE_INT ZEROING_SIZE = 256;
> +POINTER_SIZE_INT PREFETCH_STRIDE = 64;
> +Boolean PREFETCH_ENABLED = FALSE;
> +#endif
> +
>  static int get_int_property(const char *property_name)
>  {
>     assert(property_name);
> @@ -280,6 +287,33 @@
>     USE_CONCURRENT_GC= get_boolean_property("gc.concurrent_gc");
>   }
>
> +#if defined(ALLOC_ZEROING) && defined(ALLOC_PREFETCH)
> +  if(is_property_set("gc.prefetch",VM_PROPERTIES) ==1) {
> +       PREFETCH_ENABLED=get_boolean_property("gc.prefetch");
> +  }
> +
> +  if(is_property_set("gc.prefetch_distance",VM_PROPERTIES)==1) {
> +       PREFETCH_DISTANCE = get_size_property("gc.prefetch_distance");
> +       if(!PREFETCH_ENABLED) {
> +               WARN2("gc.prefetch_distance","Warning: Prefetch distance set with Prefetch
disabled!");
> +       }
> +  }
> +
> +  if(is_property_set("gc.prefetch_stride",VM_PROPERTIES)==1) {
> +       PREFETCH_STRIDE = get_size_property("gc.prefetch_stride");
> +       if(!PREFETCH_ENABLED) {
> +               WARN2("gc.prefetch_stride","Warning: Prefetch stride set  with Prefetch
disabled!");
> +       }
> +  }
> +
> +  if(is_property_set("gc.zeroing_size",VM_PROPERTIES)==1) {
> +       ZEROING_SIZE = get_size_property("gc.zeroing_size");
> +       if(!PREFETCH_ENABLED) {
> +               WARN2("gc.zeroing_size","Warning: Zeroing size set with Prefetch disabled!");
> +       }
> +  }
> +#endif
> +
>   return;
>  }
>
> @@ -403,4 +437,5 @@
>   INFO2("gc.process", "GC: GC end\n");
>   return;
>  }
> +
>
>
> Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/thread/gc_thread.h
> URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/thread/gc_thread.h?rev=596220&r1=596219&r2=596220&view=diff
> ==============================================================================
> --- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/thread/gc_thread.h (original)
> +++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/thread/gc_thread.h Mon Nov 19 00:16:50
2007
> @@ -26,18 +26,37 @@
>  #include "../common/gc_metadata.h"
>
>  #define ALLOC_ZEROING
> -#define ZEROING_SIZE  2*KB
> +#define ALLOC_PREFETCH
> +
> +#ifdef ALLOC_ZEROING
> +#ifdef ALLOC_PREFETCH
> +
> +#ifdef _WINDOWS_
> +#include <xmmintrin.h>
> +#define prefetchnta(pref_addr) _mm_prefetch((char*)(pref_addr), _MM_HINT_NTA )
> +#else
> +#define prefetchnta(pref_addr)  __asm__ ("prefetchnta (%0)"::"r"(pref_addr))
> +#endif
> +
> +extern POINTER_SIZE_INT PREFETCH_DISTANCE;
> +extern POINTER_SIZE_INT ZEROING_SIZE;
> +extern POINTER_SIZE_INT PREFETCH_STRIDE;
> +extern Boolean  PREFETCH_ENABLED;
> +#else
> +#define ZEROING_SIZE   256
> +#endif
> +#endif
>
>  extern POINTER_SIZE_INT tls_gc_offset;
>
>  inline void* gc_get_tls()
> -{
> +{
>   void* tls_base = vm_thread_local();
>   return (void*)*(POINTER_SIZE_INT*)((char*)tls_base + tls_gc_offset);
>  }
>
>  inline void gc_set_tls(void* gc_tls_info)
> -{
> +{
>   void* tls_base = vm_thread_local();
>   *(POINTER_SIZE_INT*)((char*)tls_base + tls_gc_offset) = (POINTER_SIZE_INT)gc_tls_info;
>  }
> @@ -56,26 +75,37 @@
>
>  inline void thread_local_unalloc(unsigned int size, Allocator* allocator)
>  {
> -  void* free = allocator->free;
> +  void* free = allocator->free;
>   allocator->free = (void*)((POINTER_SIZE_INT)free - size);
>   return;
>  }
>
>  #ifdef ALLOC_ZEROING
>
> -inline Partial_Reveal_Object* thread_local_alloc_zeroing(unsigned int size, Allocator*
allocator)
> +FORCE_INLINE Partial_Reveal_Object* thread_local_alloc_zeroing(unsigned int size, Allocator*
allocator)
>  {
>   POINTER_SIZE_INT free = (POINTER_SIZE_INT)allocator->free;
>   POINTER_SIZE_INT ceiling = (POINTER_SIZE_INT)allocator->ceiling;
> -
> +
>   POINTER_SIZE_INT new_free = free + size;
> -
> +
>   POINTER_SIZE_INT block_ceiling = (POINTER_SIZE_INT)allocator->end;
> -  if( new_free > block_ceiling)
> +  if( new_free > block_ceiling)
>     return NULL;
>
>   POINTER_SIZE_INT new_ceiling;
>   new_ceiling =  new_free + ZEROING_SIZE;
> +
> +#ifdef ALLOC_PREFETCH
> +  if(PREFETCH_ENABLED)  {
> +    POINTER_SIZE_INT pre_addr = new_free, pref_stride= PREFETCH_STRIDE, pref_dist= new_ceiling
+ PREFETCH_DISTANCE;
> +    do{
> +      prefetchnta(pre_addr);
> +      pre_addr += pref_stride;
> +    }while(pre_addr< pref_dist);
> +  }
> +#endif
> +
>   if( new_ceiling > block_ceiling )
>     new_ceiling = block_ceiling;
>
> @@ -88,20 +118,20 @@
>
>  #endif /* ALLOC_ZEROING */
>
> -inline Partial_Reveal_Object* thread_local_alloc(unsigned int size, Allocator* allocator)
> +FORCE_INLINE Partial_Reveal_Object* thread_local_alloc(unsigned int size, Allocator*
allocator)
>  {
>   POINTER_SIZE_INT free = (POINTER_SIZE_INT)allocator->free;
>   POINTER_SIZE_INT ceiling = (POINTER_SIZE_INT)allocator->ceiling;
> -
> +
>   POINTER_SIZE_INT new_free = free + size;
> -
> +
>   if (new_free <= ceiling){
> -       allocator->free= (void*)new_free;
> +    allocator->free= (void*)new_free;
>     return (Partial_Reveal_Object*)free;
>   }
>
>  #ifndef ALLOC_ZEROING
> -
> +
>   return NULL;
>
>  #else
> @@ -112,11 +142,11 @@
>
>  }
>
> -inline void allocator_init_free_block(Allocator* allocator, Block_Header* alloc_block)
> +FORCE_INLINE void allocator_init_free_block(Allocator* allocator, Block_Header* alloc_block)
>  {
>     assert(alloc_block->status == BLOCK_FREE);
>     alloc_block->status = BLOCK_IN_USE;
> -
> +
>     /* set allocation context */
>     void* new_free = alloc_block->free;
>     allocator->free = new_free;
> @@ -127,16 +157,23 @@
>     memset(new_free, 0, GC_BLOCK_BODY_SIZE_BYTES);
>
>  #else
> -    /* the first-time zeroing area includes block header, to make subsequent allocs
page aligned */
> -    unsigned int zeroing_size = ZEROING_SIZE - GC_BLOCK_HEADER_SIZE_BYTES;
> -    allocator->ceiling = (void*)((POINTER_SIZE_INT)new_free + zeroing_size);
> -    memset(new_free, 0, zeroing_size);
> +#ifdef ALLOC_PREFETCH
> +    if(PREFETCH_ENABLED) {
> +       POINTER_SIZE_INT pre_addr = (POINTER_SIZE_INT) new_free, pref_stride= PREFETCH_STRIDE,
pref_dist= pre_addr + PREFETCH_DISTANCE;
> +        do{
> +            prefetchnta(pre_addr);
> +            pre_addr += pref_stride;
> +        }while(pre_addr< pref_dist);
> +    }
> +#endif
> +    allocator->ceiling = (void*)((POINTER_SIZE_INT)new_free + ZEROING_SIZE);
> +    memset(new_free, 0, ZEROING_SIZE);
>
>  #endif /* #ifndef ALLOC_ZEROING */
>
>     allocator->end = alloc_block->ceiling;
> -    allocator->alloc_block = (Block*)alloc_block;
> -
> +    allocator->alloc_block = (Block*)alloc_block;
> +
>     return;
>  }
>
> @@ -144,17 +181,17 @@
>  {
>   Block_Header* block = (Block_Header*)allocator->alloc_block;
>   /* it can be NULL if GC happens before the mutator resumes, or called by collector
*/
> -  if( block != NULL ){
> +  if( block != NULL ){
>     assert(block->status == BLOCK_IN_USE);
>     block->free = allocator->free;
>     block->status = BLOCK_USED;
>     allocator->alloc_block = NULL;
>   }
> -
> +
>    allocator->free = NULL;
>    allocator->ceiling = NULL;
>    allocator->end = NULL;
> -
> +
>   return;
>  }
>
>
>
>

Mime
View raw message