回复一个远古的问题,留个纪念。
根据最近上过的有关并行计算的课,现代CPU都是以ccNUMA作为一个单位。例如下面这台电脑有2个Socket,每个Socket有2个ccNUMA,每个ccNUMA包含18个核心,每个核心有2个线程(所谓的超线程)。
为什么要分的这么仔细,原因之一就是这是因为现代CPU的高速缓存有部分(例如L3)是共享的,有部分是私有的(L1和L2)。访问缓存是有速度限制的,所以如果正确的分配核心的话,可以避免'交通拥挤‘。而且如果数据是储存在另外一个ccNUMA对应的缓存中的话,额外的访问延迟也是导致计算速度下降的原因之一。这点在OpenMP中格外明显和重要。至于MPI的话,MPI和OpenMP有本质上的差别,并且MPI可能涉及到多个Node间的网络延迟,所以这方面更加复杂。
Anyway,至少在一个Node中,不要使用超线程的线程,就使用物理核心。如果有条件可以在BIOS中关闭超线程。如果没有条件可以通过likwid找到那些Thread归属于什么位置。然后通过taskset进行固定。likwid中有个程序叫做likwid-topology,从此可以得到当前Node中的CPU的拓扑结构。如下面的内容。
多个Node暂时没有经验。但是可以通过profile对使用某些线程进行限制,我当前是没有经验的。
至于是不是对于计算速度有绝对的提升,这个我没有结论,但是如果你需要考虑有关性能的方向的话,这种控制变量也是必要的。
--------------------------------------------------------------------------------
CPU name: Intel(R) Xeon(R) Platinum 8360Y CPU @ 2.40GHz
CPU type: Intel Icelake SP processor
CPU stepping: 6
********************************************************************************
Hardware Thread Topology
********************************************************************************
Sockets: 2
Cores per socket: 36
Threads per core: 2
--------------------------------------------------------------------------------
HWThread Thread Core Die Socket Available
0 0 0 0 0 *
1 0 1 0 0 *
2 0 2 0 0 *
3 0 3 0 0 *
4 0 4 0 0 *
5 0 5 0 0 *
6 0 6 0 0 *
7 0 7 0 0 *
8 0 8 0 0 *
9 0 9 0 0 *
10 0 10 0 0 *
11 0 11 0 0 *
12 0 12 0 0 *
13 0 13 0 0 *
14 0 14 0 0 *
15 0 15 0 0 *
16 0 16 0 0 *
17 0 17 0 0 *
18 0 18 0 0 *
19 0 19 0 0 *
20 0 20 0 0 *
21 0 21 0 0 *
22 0 22 0 0 *
23 0 23 0 0 *
24 0 24 0 0 *
25 0 25 0 0 *
26 0 26 0 0 *
27 0 27 0 0 *
28 0 28 0 0 *
29 0 29 0 0 *
30 0 30 0 0 *
31 0 31 0 0 *
32 0 32 0 0 *
33 0 33 0 0 *
34 0 34 0 0 *
35 0 35 0 0 *
36 0 36 0 1 *
37 0 37 0 1 *
38 0 38 0 1 *
39 0 39 0 1 *
40 0 40 0 1 *
41 0 41 0 1 *
42 0 42 0 1 *
43 0 43 0 1 *
44 0 44 0 1 *
45 0 45 0 1 *
46 0 46 0 1 *
47 0 47 0 1 *
48 0 48 0 1 *
49 0 49 0 1 *
50 0 50 0 1 *
51 0 51 0 1 *
52 0 52 0 1 *
53 0 53 0 1 *
54 0 54 0 1 *
55 0 55 0 1 *
56 0 56 0 1 *
57 0 57 0 1 *
58 0 58 0 1 *
59 0 59 0 1 *
60 0 60 0 1 *
61 0 61 0 1 *
62 0 62 0 1 *
63 0 63 0 1 *
64 0 64 0 1 *
65 0 65 0 1 *
66 0 66 0 1 *
67 0 67 0 1 *
68 0 68 0 1 *
69 0 69 0 1 *
70 0 70 0 1 *
71 0 71 0 1 *
72 1 0 0 0 *
73 1 1 0 0 *
74 1 2 0 0 *
75 1 3 0 0 *
76 1 4 0 0 *
77 1 5 0 0 *
78 1 6 0 0 *
79 1 7 0 0 *
80 1 8 0 0 *
81 1 9 0 0 *
82 1 10 0 0 *
83 1 11 0 0 *
84 1 12 0 0 *
85 1 13 0 0 *
86 1 14 0 0 *
87 1 15 0 0 *
88 1 16 0 0 *
89 1 17 0 0 *
90 1 18 0 0 *
91 1 19 0 0 *
92 1 20 0 0 *
93 1 21 0 0 *
94 1 22 0 0 *
95 1 23 0 0 *
96 1 24 0 0 *
97 1 25 0 0 *
98 1 26 0 0 *
99 1 27 0 0 *
100 1 28 0 0 *
101 1 29 0 0 *
102 1 30 0 0 *
103 1 31 0 0 *
104 1 32 0 0 *
105 1 33 0 0 *
106 1 34 0 0 *
107 1 35 0 0 *
108 1 36 0 1 *
109 1 37 0 1 *
110 1 38 0 1 *
111 1 39 0 1 *
112 1 40 0 1 *
113 1 41 0 1 *
114 1 42 0 1 *
115 1 43 0 1 *
116 1 44 0 1 *
117 1 45 0 1 *
118 1 46 0 1 *
119 1 47 0 1 *
120 1 48 0 1 *
121 1 49 0 1 *
122 1 50 0 1 *
123 1 51 0 1 *
124 1 52 0 1 *
125 1 53 0 1 *
126 1 54 0 1 *
127 1 55 0 1 *
128 1 56 0 1 *
129 1 57 0 1 *
130 1 58 0 1 *
131 1 59 0 1 *
132 1 60 0 1 *
133 1 61 0 1 *
134 1 62 0 1 *
135 1 63 0 1 *
136 1 64 0 1 *
137 1 65 0 1 *
138 1 66 0 1 *
139 1 67 0 1 *
140 1 68 0 1 *
141 1 69 0 1 *
142 1 70 0 1 *
143 1 71 0 1 *
--------------------------------------------------------------------------------
Socket 0: ( 0 72 1 73 2 74 3 75 4 76 5 77 6 78 7 79 8 80 9 81 10 82 11 83 12 84 13 85 14 86 15 87 16 88 17 89 18 90 19 91 20 92 21 93 22 94 23 95 24 96 25 97 26 98 27 99 28 100 29 101 30 102 31 103 32 104 33 105 34 106 35 107 )
Socket 1: ( 36 108 37 109 38 110 39 111 40 112 41 113 42 114 43 115 44 116 45 117 46 118 47 119 48 120 49 121 50 122 51 123 52 124 53 125 54 126 55 127 56 128 57 129 58 130 59 131 60 132 61 133 62 134 63 135 64 136 65 137 66 138 67 139 68 140 69 141 70 142 71 143 )
--------------------------------------------------------------------------------
********************************************************************************
Cache Topology
********************************************************************************
Level: 1
Size: 48 kB
Cache groups: ( 0 72 ) ( 1 73 ) ( 2 74 ) ( 3 75 ) ( 4 76 ) ( 5 77 ) ( 6 78 ) ( 7 79 ) ( 8 80 ) ( 9 81 ) ( 10 82 ) ( 11 83 ) ( 12 84 ) ( 13 85 ) ( 14 86 ) ( 15 87 ) ( 16 88 ) ( 17 89 ) ( 18 90 ) ( 19 91 ) ( 20 92 ) ( 21 93 ) ( 22 94 ) ( 23 95 ) ( 24 96 ) ( 25 97 ) ( 26 98 ) ( 27 99 ) ( 28 100 ) ( 29 101 ) ( 30 102 ) ( 31 103 ) ( 32 104 ) ( 33 105 ) ( 34 106 ) ( 35 107 ) ( 36 108 ) ( 37 109 ) ( 38 110 ) ( 39 111 ) ( 40 112 ) ( 41 113 ) ( 42 114 ) ( 43 115 ) ( 44 116 ) ( 45 117 ) ( 46 118 ) ( 47 119 ) ( 48 120 ) ( 49 121 ) ( 50 122 ) ( 51 123 ) ( 52 124 ) ( 53 125 ) ( 54 126 ) ( 55 127 ) ( 56 128 ) ( 57 129 ) ( 58 130 ) ( 59 131 ) ( 60 132 ) ( 61 133 ) ( 62 134 ) ( 63 135 ) ( 64 136 ) ( 65 137 ) ( 66 138 ) ( 67 139 ) ( 68 140 ) ( 69 141 ) ( 70 142 ) ( 71 143 )
--------------------------------------------------------------------------------
Level: 2
Size: 1.25 MB
Cache groups: ( 0 72 ) ( 1 73 ) ( 2 74 ) ( 3 75 ) ( 4 76 ) ( 5 77 ) ( 6 78 ) ( 7 79 ) ( 8 80 ) ( 9 81 ) ( 10 82 ) ( 11 83 ) ( 12 84 ) ( 13 85 ) ( 14 86 ) ( 15 87 ) ( 16 88 ) ( 17 89 ) ( 18 90 ) ( 19 91 ) ( 20 92 ) ( 21 93 ) ( 22 94 ) ( 23 95 ) ( 24 96 ) ( 25 97 ) ( 26 98 ) ( 27 99 ) ( 28 100 ) ( 29 101 ) ( 30 102 ) ( 31 103 ) ( 32 104 ) ( 33 105 ) ( 34 106 ) ( 35 107 ) ( 36 108 ) ( 37 109 ) ( 38 110 ) ( 39 111 ) ( 40 112 ) ( 41 113 ) ( 42 114 ) ( 43 115 ) ( 44 116 ) ( 45 117 ) ( 46 118 ) ( 47 119 ) ( 48 120 ) ( 49 121 ) ( 50 122 ) ( 51 123 ) ( 52 124 ) ( 53 125 ) ( 54 126 ) ( 55 127 ) ( 56 128 ) ( 57 129 ) ( 58 130 ) ( 59 131 ) ( 60 132 ) ( 61 133 ) ( 62 134 ) ( 63 135 ) ( 64 136 ) ( 65 137 ) ( 66 138 ) ( 67 139 ) ( 68 140 ) ( 69 141 ) ( 70 142 ) ( 71 143 )
--------------------------------------------------------------------------------
Level: 3
Size: 54 MB
Cache groups: ( 0 72 1 73 2 74 3 75 4 76 5 77 6 78 7 79 8 80 9 81 10 82 11 83 12 84 13 85 14 86 15 87 16 88 17 89 18 90 19 91 20 92 21 93 22 94 23 95 24 96 25 97 26 98 27 99 28 100 29 101 30 102 31 103 32 104 33 105 34 106 35 107 ) ( 36 108 37 109 38 110 39 111 40 112 41 113 42 114 43 115 44 116 45 117 46 118 47 119 48 120 49 121 50 122 51 123 52 124 53 125 54 126 55 127 56 128 57 129 58 130 59 131 60 132 61 133 62 134 63 135 64 136 65 137 66 138 67 139 68 140 69 141 70 142 71 143 )
--------------------------------------------------------------------------------
********************************************************************************
NUMA Topology
********************************************************************************
NUMA domains: 4
--------------------------------------------------------------------------------
Domain: 0
Processors: ( 0 72 1 73 2 74 3 75 4 76 5 77 6 78 7 79 8 80 9 81 10 82 11 83 12 84 13 85 14 86 15 87 16 88 17 89 )
Distances: 10 11 20 20
Free memory: 53444.9 MB
Total memory: 64038.5 MB
--------------------------------------------------------------------------------
Domain: 1
Processors: ( 18 90 19 91 20 92 21 93 22 94 23 95 24 96 25 97 26 98 27 99 28 100 29 101 30 102 31 103 32 104 33 105 34 106 35 107 )
Distances: 11 10 20 20
Free memory: 52998.7 MB
Total memory: 64504.1 MB
--------------------------------------------------------------------------------
Domain: 2
Processors: ( 36 108 37 109 38 110 39 111 40 112 41 113 42 114 43 115 44 116 45 117 46 118 47 119 48 120 49 121 50 122 51 123 52 124 53 125 )
Distances: 20 20 10 11
Free memory: 57461.9 MB
Total memory: 64504.1 MB
--------------------------------------------------------------------------------
Domain: 3
Processors: ( 54 126 55 127 56 128 57 129 58 130 59 131 60 132 61 133 62 134 63 135 64 136 65 137 66 138 67 139 68 140 69 141 70 142 71 143 )
Distances: 20 20 11 10
Free memory: 35591.3 MB
Total memory: 64450.5 MB
--------------------------------------------------------------------------------