allocate externally so we can always fit into cache lines