[LLVMdev] Memory Subsystem Representation
Eli Friedman
eli.friedman at gmail.com
Tue May 3 09:20:00 PDT 2011
On Tue, May 3, 2011 at 8:40 AM, David Greene <dag at cray.com> wrote:
> For a while now we (Cray) have had some very primitive cache structure
> information encoded into our version of LLVM. Given the more complex
> memory structures introduced by Bulldozer and various accelerators, it's
> time to do this Right (tm).
>
> So I'm looking for some feedback on a proposed design.
>
> The goal of this work is to provide Passes with useful information such
> as cache sizes, resource sharing arrangements, etc. so that they may do
> transformations to improve memory system performance.
>
> Here's what I'm thinking this might look like:
>
> - Add two new structures to the TargetMachine class: TargetMemoryInfo
> and TargetExecutionEngineInfo.
>
> - TargetMemoryInfo will initially contain cache hierarchy information.
> It will contain a list of CacheLevelInfo objects, each of which will
> specify at least the total size of the cache at that level. It may
> also include other useful bits like associativity, inclusivity, etc.
>
> - TargetMemoryInfo could be extended with information about various
> "special" memory regions such as local, shared, etc. memory typical on
> accelerators. This should tie into the address space mechanism
> somehow.
>
> - TargetExecutionEngineInfo (probably need a better name) will contain a
> list of ExecutionResourceInfo objects, such as threads, cores,
> modules, sockets, etc. For example, for a Bulldozer-based system, we
> would have a set of cores contained in a module, a set of modules
> contained in a socket and so on.
>
> - Each ExecutionResourceInfo object would contain a name to identify the
> grouping ("thread," "core," etc.) along with information about the
> number of execution resources it contains. For example, a "core"
> object might specify that it contains two "threads."
>
> - ExecutionResourceInfo objects would also contain links to
> CacheLevelInfo objects to model how the various levels of cache are
> shared. For example, on a Bulldozer system the "core" object would
> have a link to the L1 CacheLevelInfo object, indicating that L1 is
> private to a "core." A "module" object would have a link to the L2
> CacheLevelInfo object, indicating that it is private to a "module" but
> shared by "cores" within the "module" and so on.
>
> I don't particularly like the names TargetExecutionEngineInfo and
> ExecutionResourceInfo but couldn't come up with anything better. Any
> ideas?
>
> Does this seem like a reasonable approach?
The names and the exact information stored don't seem like they really
need review; it's easy to change later. Just two questions:
1. What is the expected use? Are we talking about loop optimizations here?
2. IR-level passes don't have access to a TargetMachine; is that okay?
-Eli
More information about the llvm-dev
mailing list