libc - Add poor man's cache coloring optimization to nmalloc module.
authorMatthew Dillon <dillon@apollo.backplane.com>
Fri, 4 Jan 2013 22:24:12 +0000 (14:24 -0800)
committerMatthew Dillon <dillon@apollo.backplane.com>
Fri, 4 Jan 2013 22:24:12 +0000 (14:24 -0800)
* A series of large allocations in excess of 32KB will be offset by 4K from
  each other.  This fixes performance issues on SandyBridge and later cpus
  related to large matrix operations.

  This eats an extra 4K of VM for such allocations but does not eat any
  additional real memory.

* Greatly improves large FP matrix benchmarks.  Real-world effects are more
  questionable.

* The Sandybridge and later cpus use a virtually indexed, physically tagged
  L1 cache, and tend to be sensitive to substantially different memory
  addresses winding up on the same cache line.  Matrix operations (primarily
  benchmarks) can cause these sorts of effects.

Reported-by: alexh
lib/libc/stdlib/nmalloc.c

index 6c98d90..b1a6f29 100644 (file)
@@ -821,7 +821,15 @@ _slaballoc(size_t size, int flags)
                bigalloc_t big;
                bigalloc_t *bigp;
 
+               /*
+                * Page-align and cache-color in case of virtually indexed
+                * physically tagged L1 caches (aka SandyBridge).  No sweat
+                * otherwise, so just do it.
+                */
                size = (size + PAGE_MASK) & ~(size_t)PAGE_MASK;
+               if ((size & 8191) == 0)
+                       size += 4096;
+
                chunk = _vmem_alloc(size, PAGE_SIZE, flags);
                if (chunk == NULL)
                        return(NULL);