8148099: Improve memory access to FromCardCache during GC

Transpose the FromCardCache data array so the access during GC is linear instead of element-by-element with stride.

Reviewed-by: mgerdin, brutisso
This commit is contained in:
Thomas Schatzl 2016-04-01 11:57:58 +02:00
parent 0c5e3bcbd6
commit f8070cc44a
2 changed files with 10 additions and 7 deletions

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2001, 2015, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2001, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -37,8 +37,8 @@ void G1FromCardCache::initialize(uint num_par_rem_sets, uint max_num_regions) {
guarantee(_cache == NULL, "Should not call this multiple times"); guarantee(_cache == NULL, "Should not call this multiple times");
_max_regions = max_num_regions; _max_regions = max_num_regions;
_cache = Padded2DArray<int, mtGC>::create_unfreeable(num_par_rem_sets, _cache = Padded2DArray<int, mtGC>::create_unfreeable(_max_regions,
_max_regions, num_par_rem_sets,
&_static_mem_size); &_static_mem_size);
invalidate(0, _max_regions); invalidate(0, _max_regions);

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -32,8 +32,11 @@
// a per-region and per-thread basis. // a per-region and per-thread basis.
class G1FromCardCache : public AllStatic { class G1FromCardCache : public AllStatic {
private: private:
// Array of card indices. Indexed by thread X and heap region to minimize // Array of card indices. Indexed by heap region (rows) and thread (columns) to minimize
// thread contention. // thread contention.
// This order minimizes the time to clear all entries for a given region during region
// freeing. I.e. a single clear of a single memory area instead of multiple separate
// accesses with a large stride per region.
static int** _cache; static int** _cache;
static uint _max_regions; static uint _max_regions;
static size_t _static_mem_size; static size_t _static_mem_size;
@ -58,11 +61,11 @@ class G1FromCardCache : public AllStatic {
} }
static int at(uint worker_id, uint region_idx) { static int at(uint worker_id, uint region_idx) {
return _cache[worker_id][region_idx]; return _cache[region_idx][worker_id];
} }
static void set(uint worker_id, uint region_idx, int val) { static void set(uint worker_id, uint region_idx, int val) {
_cache[worker_id][region_idx] = val; _cache[region_idx][worker_id] = val;
} }
static void initialize(uint num_par_rem_sets, uint max_num_regions); static void initialize(uint num_par_rem_sets, uint max_num_regions);