В Ubuntu 14.04 TLS для 36 ядер всего = (2 х процессоров х 9 ядер х 2 HyperThreading), lscpu
дает мне:
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 36
On-line CPU(s) list: 0-35
Thread(s) per core: 2
Core(s) per socket: 9
Socket(s): 2
NUMA node(s): 2
Vendor ID: GenuineIntel
CPU family: 6
Model: 63
Stepping: 2
CPU MHz: 1200.000
BogoMIPS: 5858.45
Hypervisor vendor: Xen
Virtualization type: full
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 25600K
NUMA node0 CPU(s): 0-8,18-26
NUMA node1 CPU(s): 9-17,27-35
Как известно, обмен данными между ядрами одного ЦП (через cache-L3) происходит быстрее, чем между ядрами нескольких разных ЦП (через QPI-link).
0-8 и 9-17 - это физические ядра ЦП двух узлов NUMA, но 18-26 и 27-35 - это ядра HyperThreading CPU, и вначале предпочтительнее взять все физические ядра, а затем во втором раунде взять на себя два логических ядра на каждом физическом ядре, то есть это увеличит общую производительность?
Или это означает, что если я запустил более 8 потоков, например, 12 потоков, то 9 потоков (0-8) будут выполняться на 1-м процессоре (NUMA node0) и 3 потока (9-12) на 2-м процессоре (NUMA узел1)? И увеличит ли это задержку обмена между потоками и снизит общую производительность?
Как я могу изменить распределение ядер по NUMA-узлам, чтобы установить, как показано ниже?
NUMA node0 CPU(s): 0-17
NUMA node1 CPU(s): 18-35