sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget%/translations/zh_CN/arch/x86/topologymodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget%/translations/zh_TW/arch/x86/topologymodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget%/translations/it_IT/arch/x86/topologymodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget%/translations/ja_JP/arch/x86/topologymodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget%/translations/ko_KR/arch/x86/topologymodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget%/translations/sp_SP/arch/x86/topologymodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhcomment)}(h SPDX-License-Identifier: GPL-2.0h]h SPDX-License-Identifier: GPL-2.0}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhh?/var/lib/git/docbuild/linux/Documentation/arch/x86/topology.rsthKubhsection)}(hhh](htitle)}(h x86 Topologyh]h x86 Topology}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh paragraph)}(hThis documents and clarifies the main aspects of x86 topology modelling and representation in the kernel. Update/change when doing changes to the respective code.h]hThis documents and clarifies the main aspects of x86 topology modelling and representation in the kernel. Update/change when doing changes to the respective code.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hX^The architecture-agnostic topology definitions are in Documentation/admin-guide/cputopology.rst. This file holds x86-specific differences/specialities which must not necessarily apply to the generic definitions. Thus, the way to read up on Linux topology on x86 is to start with the generic one and look at this one in parallel for the x86 specifics.h]hX^The architecture-agnostic topology definitions are in Documentation/admin-guide/cputopology.rst. This file holds x86-specific differences/specialities which must not necessarily apply to the generic definitions. Thus, the way to read up on Linux topology on x86 is to start with the generic one and look at this one in parallel for the x86 specifics.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hhhhubh)}(hNeedless to say, code should use the generic functions - this file is *only* here to *document* the inner workings of x86 topology.h](hFNeedless to say, code should use the generic functions - this file is }(hhhhhNhNubhemphasis)}(h*only*h]honly}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhubh here to }(hhhhhNhNubh)}(h *document*h]hdocument}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhubh$ the inner workings of x86 topology.}(hhhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hSStarted by Thomas Gleixner and Borislav Petkov .h](hStarted by Thomas Gleixner <}(hjhhhNhNubh reference)}(htglx@linutronix.deh]htglx@linutronix.de}(hj%hhhNhNubah}(h]h ]h"]h$]h&]refurimailto:tglx@linutronix.deuh1j#hjubh> and Borislav Petkov <}(hjhhhNhNubj$)}(h bp@alien8.deh]h bp@alien8.de}(hj9hhhNhNubah}(h]h ]h"]h$]h&]refurimailto:bp@alien8.deuh1j#hjubh>.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hThe main aim of the topology facilities is to present adequate interfaces to code which needs to know/query/use the structure of the running system wrt threads, cores, packages, etc.h]hThe main aim of the topology facilities is to present adequate interfaces to code which needs to know/query/use the structure of the running system wrt threads, cores, packages, etc.}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hXThe kernel does not care about the concept of physical sockets because a socket has no relevance to software. It's an electromechanical component. In the past a socket always contained a single package (see below), but with the advent of Multi Chip Modules (MCM) a socket can hold more than one package. So there might be still references to sockets in the code, but they are of historical nature and should be cleaned up.h]hXThe kernel does not care about the concept of physical sockets because a socket has no relevance to software. It’s an electromechanical component. In the past a socket always contained a single package (see below), but with the advent of Multi Chip Modules (MCM) a socket can hold more than one package. So there might be still references to sockets in the code, but they are of historical nature and should be cleaned up.}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(h6The topology of a system is described in the units of:h]h6The topology of a system is described in the units of:}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK!hhhhubh block_quote)}(h- packages - cores - threads h]h bullet_list)}(hhh](h list_item)}(hpackagesh]h)}(hjh]hpackages}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK#hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hcoresh]h)}(hjh]hcores}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK$hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hthreads h]h)}(hthreadsh]hthreads}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK%hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]bullet-uh1jhhhK#hjubah}(h]h ]h"]h$]h&]uh1j}hhhK#hhhhubh)}(hhh](h)}(hPackageh]hPackage}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhK(ubh)}(hbPackages contain a number of cores plus shared resources, e.g. DRAM controller, shared caches etc.h]hbPackages contain a number of cores plus shared resources, e.g. DRAM controller, shared caches etc.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK)hjhhubh)}(h7Modern systems may also use the term 'Die' for package.h]h;Modern systems may also use the term ‘Die’ for package.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK,hjhhubh)}(h'AMD nomenclature for package is 'Node'.h]h+AMD nomenclature for package is ‘Node’.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK.hjhhubh)}(h3Package-related topology information in the kernel:h]h3Package-related topology information in the kernel:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK0hjhhubj~)}(hXI- topology_num_threads_per_package() The number of threads in a package. - topology_num_cores_per_package() The number of cores in a package. - topology_max_dies_per_package() The maximum number of dies in a package. - cpuinfo_x86.topo.die_id: The physical ID of the die. - cpuinfo_x86.topo.pkg_id: The physical ID of the package. This information is retrieved via CPUID and deduced from the APIC IDs of the cores in the package. Modern systems use this value for the socket. There may be multiple packages within a socket. This value may differ from topo.die_id. - cpuinfo_x86.topo.logical_pkg_id: The logical ID of the package. As we do not trust BIOSes to enumerate the packages in a consistent way, we introduced the concept of logical package ID so we can sanely calculate the number of maximum possible packages in the system and have the packages enumerated linearly. - topology_max_packages(): The maximum possible number of packages in the system. Helpful for per package facilities to preallocate per package information. - cpuinfo_x86.topo.llc_id: - On Intel, the first APIC ID of the list of CPUs sharing the Last Level Cache - On AMD, the Node ID or Core Complex ID containing the Last Level Cache. In general, it is a number identifying an LLC uniquely on the system. h]j)}(hhh](j)}(hHtopology_num_threads_per_package() The number of threads in a package. h](h)}(h"topology_num_threads_per_package()h]h"topology_num_threads_per_package()}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK2hj.ubh)}(h#The number of threads in a package.h]h#The number of threads in a package.}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK4hj.ubeh}(h]h ]h"]h$]h&]uh1jhj+ubj)}(hDtopology_num_cores_per_package() The number of cores in a package. h](h)}(h topology_num_cores_per_package()h]h topology_num_cores_per_package()}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK6hjTubh)}(h!The number of cores in a package.h]h!The number of cores in a package.}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK8hjTubeh}(h]h ]h"]h$]h&]uh1jhj+ubj)}(hJtopology_max_dies_per_package() The maximum number of dies in a package. h](h)}(htopology_max_dies_per_package()h]htopology_max_dies_per_package()}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK:hjzubh)}(h(The maximum number of dies in a package.h]h(The maximum number of dies in a package.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubh)}(hThe physical ID of the die.h]hThe physical ID of the die.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK@hjubeh}(h]h ]h"]h$]h&]uh1jhj+ubj)}(hX$cpuinfo_x86.topo.pkg_id: The physical ID of the package. This information is retrieved via CPUID and deduced from the APIC IDs of the cores in the package. Modern systems use this value for the socket. There may be multiple packages within a socket. This value may differ from topo.die_id. h](h)}(hcpuinfo_x86.topo.pkg_id:h]hcpuinfo_x86.topo.pkg_id:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKBhjubh)}(hThe physical ID of the package. This information is retrieved via CPUID and deduced from the APIC IDs of the cores in the package.h]hThe physical ID of the package. This information is retrieved via CPUID and deduced from the APIC IDs of the cores in the package.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKDhjubh)}(hModern systems use this value for the socket. There may be multiple packages within a socket. This value may differ from topo.die_id.h]hModern systems use this value for the socket. There may be multiple packages within a socket. This value may differ from topo.die_id.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKGhjubeh}(h]h ]h"]h$]h&]uh1jhj+ubj)}(hX6cpuinfo_x86.topo.logical_pkg_id: The logical ID of the package. As we do not trust BIOSes to enumerate the packages in a consistent way, we introduced the concept of logical package ID so we can sanely calculate the number of maximum possible packages in the system and have the packages enumerated linearly. h](h)}(h cpuinfo_x86.topo.logical_pkg_id:h]h cpuinfo_x86.topo.logical_pkg_id:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKJhjubh)}(hXThe logical ID of the package. As we do not trust BIOSes to enumerate the packages in a consistent way, we introduced the concept of logical package ID so we can sanely calculate the number of maximum possible packages in the system and have the packages enumerated linearly.h]hXThe logical ID of the package. As we do not trust BIOSes to enumerate the packages in a consistent way, we introduced the concept of logical package ID so we can sanely calculate the number of maximum possible packages in the system and have the packages enumerated linearly.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKLhjubeh}(h]h ]h"]h$]h&]uh1jhj+ubj)}(htopology_max_packages(): The maximum possible number of packages in the system. Helpful for per package facilities to preallocate per package information. h](h)}(htopology_max_packages():h]htopology_max_packages():}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKQhj ubh)}(hThe maximum possible number of packages in the system. Helpful for per package facilities to preallocate per package information.h]hThe maximum possible number of packages in the system. Helpful for per package facilities to preallocate per package information.}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKShj ubeh}(h]h ]h"]h$]h&]uh1jhj+ubj)}(hX cpuinfo_x86.topo.llc_id: - On Intel, the first APIC ID of the list of CPUs sharing the Last Level Cache - On AMD, the Node ID or Core Complex ID containing the Last Level Cache. In general, it is a number identifying an LLC uniquely on the system. h](h)}(hcpuinfo_x86.topo.llc_id:h]hcpuinfo_x86.topo.llc_id:}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKVhjFubj~)}(h- On Intel, the first APIC ID of the list of CPUs sharing the Last Level Cache - On AMD, the Node ID or Core Complex ID containing the Last Level Cache. In general, it is a number identifying an LLC uniquely on the system. h]j)}(hhh](j)}(hMOn Intel, the first APIC ID of the list of CPUs sharing the Last Level Cache h]h)}(hLOn Intel, the first APIC ID of the list of CPUs sharing the Last Level Cacheh]hLOn Intel, the first APIC ID of the list of CPUs sharing the Last Level Cache}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKXhj_ubah}(h]h ]h"]h$]h&]uh1jhj\ubj)}(hOn AMD, the Node ID or Core Complex ID containing the Last Level Cache. In general, it is a number identifying an LLC uniquely on the system. h]h)}(hOn AMD, the Node ID or Core Complex ID containing the Last Level Cache. In general, it is a number identifying an LLC uniquely on the system.h]hOn AMD, the Node ID or Core Complex ID containing the Last Level Cache. In general, it is a number identifying an LLC uniquely on the system.}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK[hjwubah}(h]h ]h"]h$]h&]uh1jhj\ubeh}(h]h ]h"]h$]h&]jjuh1jhhhKXhjXubah}(h]h ]h"]h$]h&]uh1j}hhhKXhjFubeh}(h]h ]h"]h$]h&]uh1jhj+ubeh}(h]h ]h"]h$]h&]jjuh1jhhhK2hj'ubah}(h]h ]h"]h$]h&]uh1j}hhhK2hjhhubeh}(h]packageah ]h"]packageah$]h&]uh1hhhhhhhhK(ubh)}(hhh](h)}(hCoresh]hCores}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhK`ubh)}(hjA core consists of 1 or more threads. It does not matter whether the threads are SMT- or CMT-type threads.h]hjA core consists of 1 or more threads. It does not matter whether the threads are SMT- or CMT-type threads.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKahjhhubh)}(hRAMDs nomenclature for a CMT core is "Compute Unit". The kernel always uses "core".h]hZAMDs nomenclature for a CMT core is “Compute Unit”. The kernel always uses “core”.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKdhjhhubeh}(h]coresah ]h"]coresah$]h&]uh1hhhhhhhhK`ubh)}(hhh](h)}(hThreadsh]hThreads}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKhubh)}(hQA thread is a single scheduling unit. It's the equivalent to a logical Linux CPU.h]hSA thread is a single scheduling unit. It’s the equivalent to a logical Linux CPU.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKihjhhubh)}(hZAMDs nomenclature for CMT threads is "Compute Unit Core". The kernel always uses "thread".h]hbAMDs nomenclature for CMT threads is “Compute Unit Core”. The kernel always uses “thread”.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKlhjhhubh)}(h2Thread-related topology information in the kernel:h]h2Thread-related topology information in the kernel:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKohjhhubj~)}(hX- topology_core_cpumask(): The cpumask contains all online threads in the package to which a thread belongs. The number of online threads is also printed in /proc/cpuinfo "siblings." - topology_sibling_cpumask(): The cpumask contains all online threads in the core to which a thread belongs. - topology_logical_package_id(): The logical package ID to which a thread belongs. - topology_physical_package_id(): The physical package ID to which a thread belongs. - topology_core_id(); The ID of the core to which a thread belongs. It is also printed in /proc/cpuinfo "core_id." - topology_logical_core_id(); The logical core ID to which a thread belongs. h]j)}(hhh](j)}(htopology_core_cpumask(): The cpumask contains all online threads in the package to which a thread belongs. The number of online threads is also printed in /proc/cpuinfo "siblings." h](h)}(htopology_core_cpumask():h]htopology_core_cpumask():}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKqhj,ubh)}(hQThe cpumask contains all online threads in the package to which a thread belongs.h]hQThe cpumask contains all online threads in the package to which a thread belongs.}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKshj,ubh)}(hIThe number of online threads is also printed in /proc/cpuinfo "siblings."h]hMThe number of online threads is also printed in /proc/cpuinfo “siblings.”}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKvhj,ubeh}(h]h ]h"]h$]h&]uh1jhj)ubj)}(hltopology_sibling_cpumask(): The cpumask contains all online threads in the core to which a thread belongs. h](h)}(htopology_sibling_cpumask():h]htopology_sibling_cpumask():}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKxhj`ubh)}(hNThe cpumask contains all online threads in the core to which a thread belongs.h]hNThe cpumask contains all online threads in the core to which a thread belongs.}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKzhj`ubeh}(h]h ]h"]h$]h&]uh1jhj)ubj)}(hRtopology_logical_package_id(): The logical package ID to which a thread belongs. h](h)}(htopology_logical_package_id():h]htopology_logical_package_id():}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK}hjubh)}(h1The logical package ID to which a thread belongs.h]h1The logical package ID to which a thread belongs.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubeh}(h]h ]h"]h$]h&]uh1jhj)ubj)}(hTtopology_physical_package_id(): The physical package ID to which a thread belongs. h](h)}(htopology_physical_package_id():h]htopology_physical_package_id():}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubh)}(h2The physical package ID to which a thread belongs.h]h2The physical package ID to which a thread belongs.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubeh}(h]h ]h"]h$]h&]uh1jhj)ubj)}(hrtopology_core_id(); The ID of the core to which a thread belongs. It is also printed in /proc/cpuinfo "core_id." h](h)}(htopology_core_id();h]htopology_core_id();}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubh)}(h\The ID of the core to which a thread belongs. It is also printed in /proc/cpuinfo "core_id."h]h`The ID of the core to which a thread belongs. It is also printed in /proc/cpuinfo “core_id.”}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubeh}(h]h ]h"]h$]h&]uh1jhj)ubj)}(hNtopology_logical_core_id(); The logical core ID to which a thread belongs. h](h)}(htopology_logical_core_id();h]htopology_logical_core_id();}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubh)}(h.The logical core ID to which a thread belongs.h]h.The logical core ID to which a thread belongs.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubeh}(h]h ]h"]h$]h&]uh1jhj)ubeh}(h]h ]h"]h$]h&]jjuh1jhhhKqhj%ubah}(h]h ]h"]h$]h&]uh1j}hhhKqhjhhubeh}(h]threadsah ]h"]threadsah$]h&]uh1hhhhhhhhKhubh)}(hhh](h)}(hSystem topology examplesh]hSystem topology examples}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2hhhhhKubhnote)}(hXVThe alternative Linux CPU enumeration depends on how the BIOS enumerates the threads. Many BIOSes enumerate all threads 0 first and then all threads 1. That has the "advantage" that the logical Linux CPU numbers of threads 0 stay the same whether threads are enabled or not. That's merely an implementation detail and has no practical impact.h]h)}(hXVThe alternative Linux CPU enumeration depends on how the BIOS enumerates the threads. Many BIOSes enumerate all threads 0 first and then all threads 1. That has the "advantage" that the logical Linux CPU numbers of threads 0 stay the same whether threads are enabled or not. That's merely an implementation detail and has no practical impact.h]hX\The alternative Linux CPU enumeration depends on how the BIOS enumerates the threads. Many BIOSes enumerate all threads 0 first and then all threads 1. That has the “advantage” that the logical Linux CPU numbers of threads 0 stay the same whether threads are enabled or not. That’s merely an implementation detail and has no practical impact.}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjEubah}(h]h ]h"]h$]h&]uh1jChj2hhhhhNubhenumerated_list)}(hhh](j)}(hTSingle Package, Single Core:: [package 0] -> [core 0] -> [thread 0] -> Linux CPU 0 h](h)}(hSingle Package, Single Core::h]hSingle Package, Single Core:}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjbubh literal_block)}(h4[package 0] -> [core 0] -> [thread 0] -> Linux CPU 0h]h4[package 0] -> [core 0] -> [thread 0] -> Linux CPU 0}hjvsbah}(h]h ]h"]h$]h&]hhuh1jthhhKhjbubeh}(h]h ]h"]h$]h&]uh1jhj_hhhhhNubj)}(hXSingle Package, Dual Core a) One thread per core:: [package 0] -> [core 0] -> [thread 0] -> Linux CPU 0 -> [core 1] -> [thread 0] -> Linux CPU 1 b) Two threads per core:: [package 0] -> [core 0] -> [thread 0] -> Linux CPU 0 -> [thread 1] -> Linux CPU 1 -> [core 1] -> [thread 0] -> Linux CPU 2 -> [thread 1] -> Linux CPU 3 Alternative enumeration:: [package 0] -> [core 0] -> [thread 0] -> Linux CPU 0 -> [thread 1] -> Linux CPU 2 -> [core 1] -> [thread 0] -> Linux CPU 1 -> [thread 1] -> Linux CPU 3 AMD nomenclature for CMT systems:: [node 0] -> [Compute Unit 0] -> [Compute Unit Core 0] -> Linux CPU 0 -> [Compute Unit Core 1] -> Linux CPU 1 -> [Compute Unit 1] -> [Compute Unit Core 0] -> Linux CPU 2 -> [Compute Unit Core 1] -> Linux CPU 3 h](h)}(hSingle Package, Dual Coreh]hSingle Package, Dual Core}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubj^)}(hhh](j)}(hOne thread per core:: [package 0] -> [core 0] -> [thread 0] -> Linux CPU 0 -> [core 1] -> [thread 0] -> Linux CPU 1 h](h)}(hOne thread per core::h]hOne thread per core:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubju)}(hi[package 0] -> [core 0] -> [thread 0] -> Linux CPU 0 -> [core 1] -> [thread 0] -> Linux CPU 1h]hi[package 0] -> [core 0] -> [thread 0] -> Linux CPU 0 -> [core 1] -> [thread 0] -> Linux CPU 1}hjsbah}(h]h ]h"]h$]h&]hhuh1jthhhKhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hX-Two threads per core:: [package 0] -> [core 0] -> [thread 0] -> Linux CPU 0 -> [thread 1] -> Linux CPU 1 -> [core 1] -> [thread 0] -> Linux CPU 2 -> [thread 1] -> Linux CPU 3 Alternative enumeration:: [package 0] -> [core 0] -> [thread 0] -> Linux CPU 0 -> [thread 1] -> Linux CPU 2 -> [core 1] -> [thread 0] -> Linux CPU 1 -> [thread 1] -> Linux CPU 3 AMD nomenclature for CMT systems:: [node 0] -> [Compute Unit 0] -> [Compute Unit Core 0] -> Linux CPU 0 -> [Compute Unit Core 1] -> Linux CPU 1 -> [Compute Unit 1] -> [Compute Unit Core 0] -> Linux CPU 2 -> [Compute Unit Core 1] -> Linux CPU 3 h](h)}(hTwo threads per core::h]hTwo threads per core:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubju)}(h[package 0] -> [core 0] -> [thread 0] -> Linux CPU 0 -> [thread 1] -> Linux CPU 1 -> [core 1] -> [thread 0] -> Linux CPU 2 -> [thread 1] -> Linux CPU 3h]h[package 0] -> [core 0] -> [thread 0] -> Linux CPU 0 -> [thread 1] -> Linux CPU 1 -> [core 1] -> [thread 0] -> Linux CPU 2 -> [thread 1] -> Linux CPU 3}hjsbah}(h]h ]h"]h$]h&]hhuh1jthhhKhjubh)}(hAlternative enumeration::h]hAlternative enumeration:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubju)}(h[package 0] -> [core 0] -> [thread 0] -> Linux CPU 0 -> [thread 1] -> Linux CPU 2 -> [core 1] -> [thread 0] -> Linux CPU 1 -> [thread 1] -> Linux CPU 3h]h[package 0] -> [core 0] -> [thread 0] -> Linux CPU 0 -> [thread 1] -> Linux CPU 2 -> [core 1] -> [thread 0] -> Linux CPU 1 -> [thread 1] -> Linux CPU 3}hjsbah}(h]h ]h"]h$]h&]hhuh1jthhhKhjubh)}(h"AMD nomenclature for CMT systems::h]h!AMD nomenclature for CMT systems:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubju)}(hX[node 0] -> [Compute Unit 0] -> [Compute Unit Core 0] -> Linux CPU 0 -> [Compute Unit Core 1] -> Linux CPU 1 -> [Compute Unit 1] -> [Compute Unit Core 0] -> Linux CPU 2 -> [Compute Unit Core 1] -> Linux CPU 3h]hX[node 0] -> [Compute Unit 0] -> [Compute Unit Core 0] -> Linux CPU 0 -> [Compute Unit Core 1] -> Linux CPU 1 -> [Compute Unit 1] -> [Compute Unit Core 0] -> Linux CPU 2 -> [Compute Unit Core 1] -> Linux CPU 3}hjsbah}(h]h ]h"]h$]h&]hhuh1jthhhKhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]enumtype loweralphaprefixhsuffix)uh1j]hjubeh}(h]h ]h"]h$]h&]uh1jhj_hhhNhNubeh}(h]h ]h"]h$]h&]j)arabicj+hj,j-uh1j]hj2hhhhhKubj^)}(hhh]j)}(hXqDual Package, Dual Core a) One thread per core:: [package 0] -> [core 0] -> [thread 0] -> Linux CPU 0 -> [core 1] -> [thread 0] -> Linux CPU 1 [package 1] -> [core 0] -> [thread 0] -> Linux CPU 2 -> [core 1] -> [thread 0] -> Linux CPU 3 b) Two threads per core:: [package 0] -> [core 0] -> [thread 0] -> Linux CPU 0 -> [thread 1] -> Linux CPU 1 -> [core 1] -> [thread 0] -> Linux CPU 2 -> [thread 1] -> Linux CPU 3 [package 1] -> [core 0] -> [thread 0] -> Linux CPU 4 -> [thread 1] -> Linux CPU 5 -> [core 1] -> [thread 0] -> Linux CPU 6 -> [thread 1] -> Linux CPU 7 Alternative enumeration:: [package 0] -> [core 0] -> [thread 0] -> Linux CPU 0 -> [thread 1] -> Linux CPU 4 -> [core 1] -> [thread 0] -> Linux CPU 1 -> [thread 1] -> Linux CPU 5 [package 1] -> [core 0] -> [thread 0] -> Linux CPU 2 -> [thread 1] -> Linux CPU 6 -> [core 1] -> [thread 0] -> Linux CPU 3 -> [thread 1] -> Linux CPU 7 AMD nomenclature for CMT systems:: [node 0] -> [Compute Unit 0] -> [Compute Unit Core 0] -> Linux CPU 0 -> [Compute Unit Core 1] -> Linux CPU 1 -> [Compute Unit 1] -> [Compute Unit Core 0] -> Linux CPU 2 -> [Compute Unit Core 1] -> Linux CPU 3 [node 1] -> [Compute Unit 0] -> [Compute Unit Core 0] -> Linux CPU 4 -> [Compute Unit Core 1] -> Linux CPU 5 -> [Compute Unit 1] -> [Compute Unit Core 0] -> Linux CPU 6 -> [Compute Unit Core 1] -> Linux CPU 7h](h)}(hDual Package, Dual Coreh]hDual Package, Dual Core}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj>ubj^)}(hhh](j)}(hOne thread per core:: [package 0] -> [core 0] -> [thread 0] -> Linux CPU 0 -> [core 1] -> [thread 0] -> Linux CPU 1 [package 1] -> [core 0] -> [thread 0] -> Linux CPU 2 -> [core 1] -> [thread 0] -> Linux CPU 3 h](h)}(hOne thread per core::h]hOne thread per core:}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjSubju)}(h[package 0] -> [core 0] -> [thread 0] -> Linux CPU 0 -> [core 1] -> [thread 0] -> Linux CPU 1 [package 1] -> [core 0] -> [thread 0] -> Linux CPU 2 -> [core 1] -> [thread 0] -> Linux CPU 3h]h[package 0] -> [core 0] -> [thread 0] -> Linux CPU 0 -> [core 1] -> [thread 0] -> Linux CPU 1 [package 1] -> [core 0] -> [thread 0] -> Linux CPU 2 -> [core 1] -> [thread 0] -> Linux CPU 3}hjesbah}(h]h ]h"]h$]h&]hhuh1jthhhKhjSubeh}(h]h ]h"]h$]h&]uh1jhjPubj)}(hXTwo threads per core:: [package 0] -> [core 0] -> [thread 0] -> Linux CPU 0 -> [thread 1] -> Linux CPU 1 -> [core 1] -> [thread 0] -> Linux CPU 2 -> [thread 1] -> Linux CPU 3 [package 1] -> [core 0] -> [thread 0] -> Linux CPU 4 -> [thread 1] -> Linux CPU 5 -> [core 1] -> [thread 0] -> Linux CPU 6 -> [thread 1] -> Linux CPU 7 Alternative enumeration:: [package 0] -> [core 0] -> [thread 0] -> Linux CPU 0 -> [thread 1] -> Linux CPU 4 -> [core 1] -> [thread 0] -> Linux CPU 1 -> [thread 1] -> Linux CPU 5 [package 1] -> [core 0] -> [thread 0] -> Linux CPU 2 -> [thread 1] -> Linux CPU 6 -> [core 1] -> [thread 0] -> Linux CPU 3 -> [thread 1] -> Linux CPU 7 AMD nomenclature for CMT systems:: [node 0] -> [Compute Unit 0] -> [Compute Unit Core 0] -> Linux CPU 0 -> [Compute Unit Core 1] -> Linux CPU 1 -> [Compute Unit 1] -> [Compute Unit Core 0] -> Linux CPU 2 -> [Compute Unit Core 1] -> Linux CPU 3 [node 1] -> [Compute Unit 0] -> [Compute Unit Core 0] -> Linux CPU 4 -> [Compute Unit Core 1] -> Linux CPU 5 -> [Compute Unit 1] -> [Compute Unit Core 0] -> Linux CPU 6 -> [Compute Unit Core 1] -> Linux CPU 7h](h)}(hTwo threads per core::h]hTwo threads per core:}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjyubju)}(hX[package 0] -> [core 0] -> [thread 0] -> Linux CPU 0 -> [thread 1] -> Linux CPU 1 -> [core 1] -> [thread 0] -> Linux CPU 2 -> [thread 1] -> Linux CPU 3 [package 1] -> [core 0] -> [thread 0] -> Linux CPU 4 -> [thread 1] -> Linux CPU 5 -> [core 1] -> [thread 0] -> Linux CPU 6 -> [thread 1] -> Linux CPU 7h]hX[package 0] -> [core 0] -> [thread 0] -> Linux CPU 0 -> [thread 1] -> Linux CPU 1 -> [core 1] -> [thread 0] -> Linux CPU 2 -> [thread 1] -> Linux CPU 3 [package 1] -> [core 0] -> [thread 0] -> Linux CPU 4 -> [thread 1] -> Linux CPU 5 -> [core 1] -> [thread 0] -> Linux CPU 6 -> [thread 1] -> Linux CPU 7}hjsbah}(h]h ]h"]h$]h&]hhuh1jthhhKhjyubh)}(hAlternative enumeration::h]hAlternative enumeration:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjyubju)}(hX[package 0] -> [core 0] -> [thread 0] -> Linux CPU 0 -> [thread 1] -> Linux CPU 4 -> [core 1] -> [thread 0] -> Linux CPU 1 -> [thread 1] -> Linux CPU 5 [package 1] -> [core 0] -> [thread 0] -> Linux CPU 2 -> [thread 1] -> Linux CPU 6 -> [core 1] -> [thread 0] -> Linux CPU 3 -> [thread 1] -> Linux CPU 7h]hX[package 0] -> [core 0] -> [thread 0] -> Linux CPU 0 -> [thread 1] -> Linux CPU 4 -> [core 1] -> [thread 0] -> Linux CPU 1 -> [thread 1] -> Linux CPU 5 [package 1] -> [core 0] -> [thread 0] -> Linux CPU 2 -> [thread 1] -> Linux CPU 6 -> [core 1] -> [thread 0] -> Linux CPU 3 -> [thread 1] -> Linux CPU 7}hjsbah}(h]h ]h"]h$]h&]hhuh1jthhhKhjyubh)}(h"AMD nomenclature for CMT systems::h]h!AMD nomenclature for CMT systems:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjyubju)}(hX([node 0] -> [Compute Unit 0] -> [Compute Unit Core 0] -> Linux CPU 0 -> [Compute Unit Core 1] -> Linux CPU 1 -> [Compute Unit 1] -> [Compute Unit Core 0] -> Linux CPU 2 -> [Compute Unit Core 1] -> Linux CPU 3 [node 1] -> [Compute Unit 0] -> [Compute Unit Core 0] -> Linux CPU 4 -> [Compute Unit Core 1] -> Linux CPU 5 -> [Compute Unit 1] -> [Compute Unit Core 0] -> Linux CPU 6 -> [Compute Unit Core 1] -> Linux CPU 7h]hX([node 0] -> [Compute Unit 0] -> [Compute Unit Core 0] -> Linux CPU 0 -> [Compute Unit Core 1] -> Linux CPU 1 -> [Compute Unit 1] -> [Compute Unit Core 0] -> Linux CPU 2 -> [Compute Unit Core 1] -> Linux CPU 3 [node 1] -> [Compute Unit 0] -> [Compute Unit Core 0] -> Linux CPU 4 -> [Compute Unit Core 1] -> Linux CPU 5 -> [Compute Unit 1] -> [Compute Unit Core 0] -> Linux CPU 6 -> [Compute Unit Core 1] -> Linux CPU 7}hjsbah}(h]h ]h"]h$]h&]hhuh1jthhhKhjyubeh}(h]h ]h"]h$]h&]uh1jhjPubeh}(h]h ]h"]h$]h&]j)j*j+hj,j-uh1j]hj>ubeh}(h]h ]h"]h$]h&]uh1jhj;hhhNhNubah}(h]h ]h"]h$]h&]j)j:j+hj,j-startKuh1j]hj2hhhhhKubeh}(h]system-topology-examplesah ]h"]system topology examplesah$]h&]uh1hhhhhhhhKubeh}(h] x86-topologyah ]h"] x86 topologyah$]h&]uh1hhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(hN generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerjerror_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}nameids}(jjjjjjj/j,jju nametypes}(jjjj/juh}(jhjjjjj,jjj2u footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}Rparse_messages]hsystem_message)}(hhh]h)}(h:Enumerated list start value not ordinal-1: "4" (ordinal 4)h]h>Enumerated list start value not ordinal-1: “4” (ordinal 4)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]levelKtypeINFOsourcehlineKuh1jhj2hhhhhKubatransform_messages] transformerN include_log] decorationNhhub.