Skip to content
A Julia API for hwloc
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
deps
src
test
.gitignore
.travis.yml
LICENSE.md Rename package from hwloc to Hwloc Aug 27, 2015
Manifest.toml
Project.toml
README.md
REQUIRE
appveyor.yml

README.md

Portable Hardware Locality (Hwloc)

Build Status Build status Coverage Status

This Julia package wraps the hwloc library.

The Portable Hardware Locality (hwloc) software package provides a portable abstraction (across OS, versions, architectures, ...) of the hierarchical topology of modern architectures, including NUMA memory nodes, sockets, shared caches, cores and simultaneous multithreading. It also gathers various system attributes such as cache and memory information as well as the locality of I/O devices such as network interfaces, InfiniBand HCAs or GPUs. It primarily aims at helping applications with gathering information about modern computing hardware so as to exploit it accordingly and efficiently.

http://www.open-mpi.org/projects/hwloc/

Usage

The Julia module Hwloc provides a high-level wrapper of the hwloc library; that is, hwloc's data structure are translated into Julia types that contain the same information, but are modified to look "natural" in Julia. Low-level administrative tasks are hidden.

The most important function is Hwloc.topology_load, which examines the current node's hardware topology (memories, caches, cores, etc.), and returns a tree structure describing this topology. This corresponds to the output of the lstopo program.

import Hwloc
topology = Hwloc.topology_load()
println("Machine topology:")
print(topology)

This outputs the full information, such as:

D0: L0 P0 Machine  
    D1: L0 P0 Node  
        D2: L0 P0 Cache  Cache{size=8388608,depth=3,linesize=64,associativity=0,type=Unified}
            D3: L0 P0 Cache  Cache{size=262144,depth=2,linesize=64,associativity=8,type=Unified}
                D4: L0 P0 Cache  Cache{size=32768,depth=1,linesize=64,associativity=0,type=Data}
                    D5: L0 P0 Core  
                        D6: L0 P0 PU  
                        D6: L1 P1 PU  
            D3: L1 P1 Cache  Cache{size=262144,depth=2,linesize=64,associativity=8,type=Unified}
                D4: L1 P1 Cache  Cache{size=32768,depth=1,linesize=64,associativity=0,type=Data}
                    D5: L1 P1 Core  
                        D6: L2 P2 PU  
                        D6: L3 P3 PU  
            D3: L2 P2 Cache  Cache{size=262144,depth=2,linesize=64,associativity=8,type=Unified}
                D4: L2 P2 Cache  Cache{size=32768,depth=1,linesize=64,associativity=0,type=Data}
                    D5: L2 P2 Core  
                        D6: L4 P4 PU  
                        D6: L5 P5 PU  
            D3: L3 P3 Cache  Cache{size=262144,depth=2,linesize=64,associativity=8,type=Unified}
                D4: L3 P3 Cache  Cache{size=32768,depth=1,linesize=64,associativity=0,type=Data}
                    D5: L3 P3 Core  
                        D6: L6 P6 PU  
                        D6: L7 P7 PU  

Often, one only wants an overview of the topology, omitting details. The function Hwloc.getinfo does this, similar to the output of the hwloc-info program.

import Hwloc
topology = Hwloc.topology_load()
summary = Hwloc.getinfo(topology)
println("Machine overview:")
for obj in summary
    obj_type = obj[1]
    count = obj[2]
    println("$count $obj_type")
end

This may output:

1 Machine
1 Node
1 Cache
4 Cache
4 Cache
4 Core
8 PU

Obtaining particular information:

The number of (physical) cores and virtual cores (PUs):

import Hwloc
topology = Hwloc.topology_load()
counts = Hwloc.histmap(topology)
ncores = counts[:Core]
npus = counts[:PU]
println("This machine has $ncores cores and $npus PUs (processing units)")

This may print:

This machine has 4 cores and 8 PUs (processing units)

A shortcut is also provided for the number of (physical) cores:

import Hwloc
ncores = Hwloc.num_physical_cores()

The L1 cache properties:

import Hwloc
topology = Hwloc.topology_load()
l1cache = first(filter(t->t.type_==:Cache && t.attr.depth==1, topology)).attr
println("L1 cache information: $l1cache")

This may print:

L1 cache information: Cache{size=32768,depth=1,linesize=64,associativity=0,type=Data}
You can’t perform that action at this time.