Chris@87
|
1 #!/usr/bin/env python
|
Chris@87
|
2 """
|
Chris@87
|
3 cpuinfo
|
Chris@87
|
4
|
Chris@87
|
5 Copyright 2002 Pearu Peterson all rights reserved,
|
Chris@87
|
6 Pearu Peterson <pearu@cens.ioc.ee>
|
Chris@87
|
7 Permission to use, modify, and distribute this software is given under the
|
Chris@87
|
8 terms of the NumPy (BSD style) license. See LICENSE.txt that came with
|
Chris@87
|
9 this distribution for specifics.
|
Chris@87
|
10
|
Chris@87
|
11 NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
|
Chris@87
|
12 Pearu Peterson
|
Chris@87
|
13
|
Chris@87
|
14 """
|
Chris@87
|
15 from __future__ import division, absolute_import, print_function
|
Chris@87
|
16
|
Chris@87
|
17 __all__ = ['cpu']
|
Chris@87
|
18
|
Chris@87
|
19 import sys, re, types
|
Chris@87
|
20 import os
|
Chris@87
|
21
|
Chris@87
|
22 if sys.version_info[0] >= 3:
|
Chris@87
|
23 from subprocess import getstatusoutput
|
Chris@87
|
24 else:
|
Chris@87
|
25 from commands import getstatusoutput
|
Chris@87
|
26
|
Chris@87
|
27 import warnings
|
Chris@87
|
28 import platform
|
Chris@87
|
29
|
Chris@87
|
30 from numpy.distutils.compat import get_exception
|
Chris@87
|
31
|
Chris@87
|
32 def getoutput(cmd, successful_status=(0,), stacklevel=1):
|
Chris@87
|
33 try:
|
Chris@87
|
34 status, output = getstatusoutput(cmd)
|
Chris@87
|
35 except EnvironmentError:
|
Chris@87
|
36 e = get_exception()
|
Chris@87
|
37 warnings.warn(str(e), UserWarning, stacklevel=stacklevel)
|
Chris@87
|
38 return False, output
|
Chris@87
|
39 if os.WIFEXITED(status) and os.WEXITSTATUS(status) in successful_status:
|
Chris@87
|
40 return True, output
|
Chris@87
|
41 return False, output
|
Chris@87
|
42
|
Chris@87
|
43 def command_info(successful_status=(0,), stacklevel=1, **kw):
|
Chris@87
|
44 info = {}
|
Chris@87
|
45 for key in kw:
|
Chris@87
|
46 ok, output = getoutput(kw[key], successful_status=successful_status,
|
Chris@87
|
47 stacklevel=stacklevel+1)
|
Chris@87
|
48 if ok:
|
Chris@87
|
49 info[key] = output.strip()
|
Chris@87
|
50 return info
|
Chris@87
|
51
|
Chris@87
|
52 def command_by_line(cmd, successful_status=(0,), stacklevel=1):
|
Chris@87
|
53 ok, output = getoutput(cmd, successful_status=successful_status,
|
Chris@87
|
54 stacklevel=stacklevel+1)
|
Chris@87
|
55 if not ok:
|
Chris@87
|
56 return
|
Chris@87
|
57 for line in output.splitlines():
|
Chris@87
|
58 yield line.strip()
|
Chris@87
|
59
|
Chris@87
|
60 def key_value_from_command(cmd, sep, successful_status=(0,),
|
Chris@87
|
61 stacklevel=1):
|
Chris@87
|
62 d = {}
|
Chris@87
|
63 for line in command_by_line(cmd, successful_status=successful_status,
|
Chris@87
|
64 stacklevel=stacklevel+1):
|
Chris@87
|
65 l = [s.strip() for s in line.split(sep, 1)]
|
Chris@87
|
66 if len(l) == 2:
|
Chris@87
|
67 d[l[0]] = l[1]
|
Chris@87
|
68 return d
|
Chris@87
|
69
|
Chris@87
|
70 class CPUInfoBase(object):
|
Chris@87
|
71 """Holds CPU information and provides methods for requiring
|
Chris@87
|
72 the availability of various CPU features.
|
Chris@87
|
73 """
|
Chris@87
|
74
|
Chris@87
|
75 def _try_call(self, func):
|
Chris@87
|
76 try:
|
Chris@87
|
77 return func()
|
Chris@87
|
78 except:
|
Chris@87
|
79 pass
|
Chris@87
|
80
|
Chris@87
|
81 def __getattr__(self, name):
|
Chris@87
|
82 if not name.startswith('_'):
|
Chris@87
|
83 if hasattr(self, '_'+name):
|
Chris@87
|
84 attr = getattr(self, '_'+name)
|
Chris@87
|
85 if isinstance(attr, types.MethodType):
|
Chris@87
|
86 return lambda func=self._try_call,attr=attr : func(attr)
|
Chris@87
|
87 else:
|
Chris@87
|
88 return lambda : None
|
Chris@87
|
89 raise AttributeError(name)
|
Chris@87
|
90
|
Chris@87
|
91 def _getNCPUs(self):
|
Chris@87
|
92 return 1
|
Chris@87
|
93
|
Chris@87
|
94 def __get_nbits(self):
|
Chris@87
|
95 abits = platform.architecture()[0]
|
Chris@87
|
96 nbits = re.compile('(\d+)bit').search(abits).group(1)
|
Chris@87
|
97 return nbits
|
Chris@87
|
98
|
Chris@87
|
99 def _is_32bit(self):
|
Chris@87
|
100 return self.__get_nbits() == '32'
|
Chris@87
|
101
|
Chris@87
|
102 def _is_64bit(self):
|
Chris@87
|
103 return self.__get_nbits() == '64'
|
Chris@87
|
104
|
Chris@87
|
105 class LinuxCPUInfo(CPUInfoBase):
|
Chris@87
|
106
|
Chris@87
|
107 info = None
|
Chris@87
|
108
|
Chris@87
|
109 def __init__(self):
|
Chris@87
|
110 if self.info is not None:
|
Chris@87
|
111 return
|
Chris@87
|
112 info = [ {} ]
|
Chris@87
|
113 ok, output = getoutput('uname -m')
|
Chris@87
|
114 if ok:
|
Chris@87
|
115 info[0]['uname_m'] = output.strip()
|
Chris@87
|
116 try:
|
Chris@87
|
117 fo = open('/proc/cpuinfo')
|
Chris@87
|
118 except EnvironmentError:
|
Chris@87
|
119 e = get_exception()
|
Chris@87
|
120 warnings.warn(str(e), UserWarning)
|
Chris@87
|
121 else:
|
Chris@87
|
122 for line in fo:
|
Chris@87
|
123 name_value = [s.strip() for s in line.split(':', 1)]
|
Chris@87
|
124 if len(name_value) != 2:
|
Chris@87
|
125 continue
|
Chris@87
|
126 name, value = name_value
|
Chris@87
|
127 if not info or name in info[-1]: # next processor
|
Chris@87
|
128 info.append({})
|
Chris@87
|
129 info[-1][name] = value
|
Chris@87
|
130 fo.close()
|
Chris@87
|
131 self.__class__.info = info
|
Chris@87
|
132
|
Chris@87
|
133 def _not_impl(self): pass
|
Chris@87
|
134
|
Chris@87
|
135 # Athlon
|
Chris@87
|
136
|
Chris@87
|
137 def _is_AMD(self):
|
Chris@87
|
138 return self.info[0]['vendor_id']=='AuthenticAMD'
|
Chris@87
|
139
|
Chris@87
|
140 def _is_AthlonK6_2(self):
|
Chris@87
|
141 return self._is_AMD() and self.info[0]['model'] == '2'
|
Chris@87
|
142
|
Chris@87
|
143 def _is_AthlonK6_3(self):
|
Chris@87
|
144 return self._is_AMD() and self.info[0]['model'] == '3'
|
Chris@87
|
145
|
Chris@87
|
146 def _is_AthlonK6(self):
|
Chris@87
|
147 return re.match(r'.*?AMD-K6', self.info[0]['model name']) is not None
|
Chris@87
|
148
|
Chris@87
|
149 def _is_AthlonK7(self):
|
Chris@87
|
150 return re.match(r'.*?AMD-K7', self.info[0]['model name']) is not None
|
Chris@87
|
151
|
Chris@87
|
152 def _is_AthlonMP(self):
|
Chris@87
|
153 return re.match(r'.*?Athlon\(tm\) MP\b',
|
Chris@87
|
154 self.info[0]['model name']) is not None
|
Chris@87
|
155
|
Chris@87
|
156 def _is_AMD64(self):
|
Chris@87
|
157 return self.is_AMD() and self.info[0]['family'] == '15'
|
Chris@87
|
158
|
Chris@87
|
159 def _is_Athlon64(self):
|
Chris@87
|
160 return re.match(r'.*?Athlon\(tm\) 64\b',
|
Chris@87
|
161 self.info[0]['model name']) is not None
|
Chris@87
|
162
|
Chris@87
|
163 def _is_AthlonHX(self):
|
Chris@87
|
164 return re.match(r'.*?Athlon HX\b',
|
Chris@87
|
165 self.info[0]['model name']) is not None
|
Chris@87
|
166
|
Chris@87
|
167 def _is_Opteron(self):
|
Chris@87
|
168 return re.match(r'.*?Opteron\b',
|
Chris@87
|
169 self.info[0]['model name']) is not None
|
Chris@87
|
170
|
Chris@87
|
171 def _is_Hammer(self):
|
Chris@87
|
172 return re.match(r'.*?Hammer\b',
|
Chris@87
|
173 self.info[0]['model name']) is not None
|
Chris@87
|
174
|
Chris@87
|
175 # Alpha
|
Chris@87
|
176
|
Chris@87
|
177 def _is_Alpha(self):
|
Chris@87
|
178 return self.info[0]['cpu']=='Alpha'
|
Chris@87
|
179
|
Chris@87
|
180 def _is_EV4(self):
|
Chris@87
|
181 return self.is_Alpha() and self.info[0]['cpu model'] == 'EV4'
|
Chris@87
|
182
|
Chris@87
|
183 def _is_EV5(self):
|
Chris@87
|
184 return self.is_Alpha() and self.info[0]['cpu model'] == 'EV5'
|
Chris@87
|
185
|
Chris@87
|
186 def _is_EV56(self):
|
Chris@87
|
187 return self.is_Alpha() and self.info[0]['cpu model'] == 'EV56'
|
Chris@87
|
188
|
Chris@87
|
189 def _is_PCA56(self):
|
Chris@87
|
190 return self.is_Alpha() and self.info[0]['cpu model'] == 'PCA56'
|
Chris@87
|
191
|
Chris@87
|
192 # Intel
|
Chris@87
|
193
|
Chris@87
|
194 #XXX
|
Chris@87
|
195 _is_i386 = _not_impl
|
Chris@87
|
196
|
Chris@87
|
197 def _is_Intel(self):
|
Chris@87
|
198 return self.info[0]['vendor_id']=='GenuineIntel'
|
Chris@87
|
199
|
Chris@87
|
200 def _is_i486(self):
|
Chris@87
|
201 return self.info[0]['cpu']=='i486'
|
Chris@87
|
202
|
Chris@87
|
203 def _is_i586(self):
|
Chris@87
|
204 return self.is_Intel() and self.info[0]['cpu family'] == '5'
|
Chris@87
|
205
|
Chris@87
|
206 def _is_i686(self):
|
Chris@87
|
207 return self.is_Intel() and self.info[0]['cpu family'] == '6'
|
Chris@87
|
208
|
Chris@87
|
209 def _is_Celeron(self):
|
Chris@87
|
210 return re.match(r'.*?Celeron',
|
Chris@87
|
211 self.info[0]['model name']) is not None
|
Chris@87
|
212
|
Chris@87
|
213 def _is_Pentium(self):
|
Chris@87
|
214 return re.match(r'.*?Pentium',
|
Chris@87
|
215 self.info[0]['model name']) is not None
|
Chris@87
|
216
|
Chris@87
|
217 def _is_PentiumII(self):
|
Chris@87
|
218 return re.match(r'.*?Pentium.*?II\b',
|
Chris@87
|
219 self.info[0]['model name']) is not None
|
Chris@87
|
220
|
Chris@87
|
221 def _is_PentiumPro(self):
|
Chris@87
|
222 return re.match(r'.*?PentiumPro\b',
|
Chris@87
|
223 self.info[0]['model name']) is not None
|
Chris@87
|
224
|
Chris@87
|
225 def _is_PentiumMMX(self):
|
Chris@87
|
226 return re.match(r'.*?Pentium.*?MMX\b',
|
Chris@87
|
227 self.info[0]['model name']) is not None
|
Chris@87
|
228
|
Chris@87
|
229 def _is_PentiumIII(self):
|
Chris@87
|
230 return re.match(r'.*?Pentium.*?III\b',
|
Chris@87
|
231 self.info[0]['model name']) is not None
|
Chris@87
|
232
|
Chris@87
|
233 def _is_PentiumIV(self):
|
Chris@87
|
234 return re.match(r'.*?Pentium.*?(IV|4)\b',
|
Chris@87
|
235 self.info[0]['model name']) is not None
|
Chris@87
|
236
|
Chris@87
|
237 def _is_PentiumM(self):
|
Chris@87
|
238 return re.match(r'.*?Pentium.*?M\b',
|
Chris@87
|
239 self.info[0]['model name']) is not None
|
Chris@87
|
240
|
Chris@87
|
241 def _is_Prescott(self):
|
Chris@87
|
242 return self.is_PentiumIV() and self.has_sse3()
|
Chris@87
|
243
|
Chris@87
|
244 def _is_Nocona(self):
|
Chris@87
|
245 return self.is_Intel() \
|
Chris@87
|
246 and (self.info[0]['cpu family'] == '6' \
|
Chris@87
|
247 or self.info[0]['cpu family'] == '15' ) \
|
Chris@87
|
248 and (self.has_sse3() and not self.has_ssse3())\
|
Chris@87
|
249 and re.match(r'.*?\blm\b', self.info[0]['flags']) is not None
|
Chris@87
|
250
|
Chris@87
|
251 def _is_Core2(self):
|
Chris@87
|
252 return self.is_64bit() and self.is_Intel() and \
|
Chris@87
|
253 re.match(r'.*?Core\(TM\)2\b', \
|
Chris@87
|
254 self.info[0]['model name']) is not None
|
Chris@87
|
255
|
Chris@87
|
256 def _is_Itanium(self):
|
Chris@87
|
257 return re.match(r'.*?Itanium\b',
|
Chris@87
|
258 self.info[0]['family']) is not None
|
Chris@87
|
259
|
Chris@87
|
260 def _is_XEON(self):
|
Chris@87
|
261 return re.match(r'.*?XEON\b',
|
Chris@87
|
262 self.info[0]['model name'], re.IGNORECASE) is not None
|
Chris@87
|
263
|
Chris@87
|
264 _is_Xeon = _is_XEON
|
Chris@87
|
265
|
Chris@87
|
266 # Varia
|
Chris@87
|
267
|
Chris@87
|
268 def _is_singleCPU(self):
|
Chris@87
|
269 return len(self.info) == 1
|
Chris@87
|
270
|
Chris@87
|
271 def _getNCPUs(self):
|
Chris@87
|
272 return len(self.info)
|
Chris@87
|
273
|
Chris@87
|
274 def _has_fdiv_bug(self):
|
Chris@87
|
275 return self.info[0]['fdiv_bug']=='yes'
|
Chris@87
|
276
|
Chris@87
|
277 def _has_f00f_bug(self):
|
Chris@87
|
278 return self.info[0]['f00f_bug']=='yes'
|
Chris@87
|
279
|
Chris@87
|
280 def _has_mmx(self):
|
Chris@87
|
281 return re.match(r'.*?\bmmx\b', self.info[0]['flags']) is not None
|
Chris@87
|
282
|
Chris@87
|
283 def _has_sse(self):
|
Chris@87
|
284 return re.match(r'.*?\bsse\b', self.info[0]['flags']) is not None
|
Chris@87
|
285
|
Chris@87
|
286 def _has_sse2(self):
|
Chris@87
|
287 return re.match(r'.*?\bsse2\b', self.info[0]['flags']) is not None
|
Chris@87
|
288
|
Chris@87
|
289 def _has_sse3(self):
|
Chris@87
|
290 return re.match(r'.*?\bpni\b', self.info[0]['flags']) is not None
|
Chris@87
|
291
|
Chris@87
|
292 def _has_ssse3(self):
|
Chris@87
|
293 return re.match(r'.*?\bssse3\b', self.info[0]['flags']) is not None
|
Chris@87
|
294
|
Chris@87
|
295 def _has_3dnow(self):
|
Chris@87
|
296 return re.match(r'.*?\b3dnow\b', self.info[0]['flags']) is not None
|
Chris@87
|
297
|
Chris@87
|
298 def _has_3dnowext(self):
|
Chris@87
|
299 return re.match(r'.*?\b3dnowext\b', self.info[0]['flags']) is not None
|
Chris@87
|
300
|
Chris@87
|
301 class IRIXCPUInfo(CPUInfoBase):
|
Chris@87
|
302 info = None
|
Chris@87
|
303
|
Chris@87
|
304 def __init__(self):
|
Chris@87
|
305 if self.info is not None:
|
Chris@87
|
306 return
|
Chris@87
|
307 info = key_value_from_command('sysconf', sep=' ',
|
Chris@87
|
308 successful_status=(0, 1))
|
Chris@87
|
309 self.__class__.info = info
|
Chris@87
|
310
|
Chris@87
|
311 def _not_impl(self): pass
|
Chris@87
|
312
|
Chris@87
|
313 def _is_singleCPU(self):
|
Chris@87
|
314 return self.info.get('NUM_PROCESSORS') == '1'
|
Chris@87
|
315
|
Chris@87
|
316 def _getNCPUs(self):
|
Chris@87
|
317 return int(self.info.get('NUM_PROCESSORS', 1))
|
Chris@87
|
318
|
Chris@87
|
319 def __cputype(self, n):
|
Chris@87
|
320 return self.info.get('PROCESSORS').split()[0].lower() == 'r%s' % (n)
|
Chris@87
|
321 def _is_r2000(self): return self.__cputype(2000)
|
Chris@87
|
322 def _is_r3000(self): return self.__cputype(3000)
|
Chris@87
|
323 def _is_r3900(self): return self.__cputype(3900)
|
Chris@87
|
324 def _is_r4000(self): return self.__cputype(4000)
|
Chris@87
|
325 def _is_r4100(self): return self.__cputype(4100)
|
Chris@87
|
326 def _is_r4300(self): return self.__cputype(4300)
|
Chris@87
|
327 def _is_r4400(self): return self.__cputype(4400)
|
Chris@87
|
328 def _is_r4600(self): return self.__cputype(4600)
|
Chris@87
|
329 def _is_r4650(self): return self.__cputype(4650)
|
Chris@87
|
330 def _is_r5000(self): return self.__cputype(5000)
|
Chris@87
|
331 def _is_r6000(self): return self.__cputype(6000)
|
Chris@87
|
332 def _is_r8000(self): return self.__cputype(8000)
|
Chris@87
|
333 def _is_r10000(self): return self.__cputype(10000)
|
Chris@87
|
334 def _is_r12000(self): return self.__cputype(12000)
|
Chris@87
|
335 def _is_rorion(self): return self.__cputype('orion')
|
Chris@87
|
336
|
Chris@87
|
337 def get_ip(self):
|
Chris@87
|
338 try: return self.info.get('MACHINE')
|
Chris@87
|
339 except: pass
|
Chris@87
|
340 def __machine(self, n):
|
Chris@87
|
341 return self.info.get('MACHINE').lower() == 'ip%s' % (n)
|
Chris@87
|
342 def _is_IP19(self): return self.__machine(19)
|
Chris@87
|
343 def _is_IP20(self): return self.__machine(20)
|
Chris@87
|
344 def _is_IP21(self): return self.__machine(21)
|
Chris@87
|
345 def _is_IP22(self): return self.__machine(22)
|
Chris@87
|
346 def _is_IP22_4k(self): return self.__machine(22) and self._is_r4000()
|
Chris@87
|
347 def _is_IP22_5k(self): return self.__machine(22) and self._is_r5000()
|
Chris@87
|
348 def _is_IP24(self): return self.__machine(24)
|
Chris@87
|
349 def _is_IP25(self): return self.__machine(25)
|
Chris@87
|
350 def _is_IP26(self): return self.__machine(26)
|
Chris@87
|
351 def _is_IP27(self): return self.__machine(27)
|
Chris@87
|
352 def _is_IP28(self): return self.__machine(28)
|
Chris@87
|
353 def _is_IP30(self): return self.__machine(30)
|
Chris@87
|
354 def _is_IP32(self): return self.__machine(32)
|
Chris@87
|
355 def _is_IP32_5k(self): return self.__machine(32) and self._is_r5000()
|
Chris@87
|
356 def _is_IP32_10k(self): return self.__machine(32) and self._is_r10000()
|
Chris@87
|
357
|
Chris@87
|
358
|
Chris@87
|
359 class DarwinCPUInfo(CPUInfoBase):
|
Chris@87
|
360 info = None
|
Chris@87
|
361
|
Chris@87
|
362 def __init__(self):
|
Chris@87
|
363 if self.info is not None:
|
Chris@87
|
364 return
|
Chris@87
|
365 info = command_info(arch='arch',
|
Chris@87
|
366 machine='machine')
|
Chris@87
|
367 info['sysctl_hw'] = key_value_from_command('sysctl hw', sep='=')
|
Chris@87
|
368 self.__class__.info = info
|
Chris@87
|
369
|
Chris@87
|
370 def _not_impl(self): pass
|
Chris@87
|
371
|
Chris@87
|
372 def _getNCPUs(self):
|
Chris@87
|
373 return int(self.info['sysctl_hw'].get('hw.ncpu', 1))
|
Chris@87
|
374
|
Chris@87
|
375 def _is_Power_Macintosh(self):
|
Chris@87
|
376 return self.info['sysctl_hw']['hw.machine']=='Power Macintosh'
|
Chris@87
|
377
|
Chris@87
|
378 def _is_i386(self):
|
Chris@87
|
379 return self.info['arch']=='i386'
|
Chris@87
|
380 def _is_ppc(self):
|
Chris@87
|
381 return self.info['arch']=='ppc'
|
Chris@87
|
382
|
Chris@87
|
383 def __machine(self, n):
|
Chris@87
|
384 return self.info['machine'] == 'ppc%s'%n
|
Chris@87
|
385 def _is_ppc601(self): return self.__machine(601)
|
Chris@87
|
386 def _is_ppc602(self): return self.__machine(602)
|
Chris@87
|
387 def _is_ppc603(self): return self.__machine(603)
|
Chris@87
|
388 def _is_ppc603e(self): return self.__machine('603e')
|
Chris@87
|
389 def _is_ppc604(self): return self.__machine(604)
|
Chris@87
|
390 def _is_ppc604e(self): return self.__machine('604e')
|
Chris@87
|
391 def _is_ppc620(self): return self.__machine(620)
|
Chris@87
|
392 def _is_ppc630(self): return self.__machine(630)
|
Chris@87
|
393 def _is_ppc740(self): return self.__machine(740)
|
Chris@87
|
394 def _is_ppc7400(self): return self.__machine(7400)
|
Chris@87
|
395 def _is_ppc7450(self): return self.__machine(7450)
|
Chris@87
|
396 def _is_ppc750(self): return self.__machine(750)
|
Chris@87
|
397 def _is_ppc403(self): return self.__machine(403)
|
Chris@87
|
398 def _is_ppc505(self): return self.__machine(505)
|
Chris@87
|
399 def _is_ppc801(self): return self.__machine(801)
|
Chris@87
|
400 def _is_ppc821(self): return self.__machine(821)
|
Chris@87
|
401 def _is_ppc823(self): return self.__machine(823)
|
Chris@87
|
402 def _is_ppc860(self): return self.__machine(860)
|
Chris@87
|
403
|
Chris@87
|
404
|
Chris@87
|
405 class SunOSCPUInfo(CPUInfoBase):
|
Chris@87
|
406
|
Chris@87
|
407 info = None
|
Chris@87
|
408
|
Chris@87
|
409 def __init__(self):
|
Chris@87
|
410 if self.info is not None:
|
Chris@87
|
411 return
|
Chris@87
|
412 info = command_info(arch='arch',
|
Chris@87
|
413 mach='mach',
|
Chris@87
|
414 uname_i='uname_i',
|
Chris@87
|
415 isainfo_b='isainfo -b',
|
Chris@87
|
416 isainfo_n='isainfo -n',
|
Chris@87
|
417 )
|
Chris@87
|
418 info['uname_X'] = key_value_from_command('uname -X', sep='=')
|
Chris@87
|
419 for line in command_by_line('psrinfo -v 0'):
|
Chris@87
|
420 m = re.match(r'\s*The (?P<p>[\w\d]+) processor operates at', line)
|
Chris@87
|
421 if m:
|
Chris@87
|
422 info['processor'] = m.group('p')
|
Chris@87
|
423 break
|
Chris@87
|
424 self.__class__.info = info
|
Chris@87
|
425
|
Chris@87
|
426 def _not_impl(self): pass
|
Chris@87
|
427
|
Chris@87
|
428 def _is_i386(self):
|
Chris@87
|
429 return self.info['isainfo_n']=='i386'
|
Chris@87
|
430 def _is_sparc(self):
|
Chris@87
|
431 return self.info['isainfo_n']=='sparc'
|
Chris@87
|
432 def _is_sparcv9(self):
|
Chris@87
|
433 return self.info['isainfo_n']=='sparcv9'
|
Chris@87
|
434
|
Chris@87
|
435 def _getNCPUs(self):
|
Chris@87
|
436 return int(self.info['uname_X'].get('NumCPU', 1))
|
Chris@87
|
437
|
Chris@87
|
438 def _is_sun4(self):
|
Chris@87
|
439 return self.info['arch']=='sun4'
|
Chris@87
|
440
|
Chris@87
|
441 def _is_SUNW(self):
|
Chris@87
|
442 return re.match(r'SUNW', self.info['uname_i']) is not None
|
Chris@87
|
443 def _is_sparcstation5(self):
|
Chris@87
|
444 return re.match(r'.*SPARCstation-5', self.info['uname_i']) is not None
|
Chris@87
|
445 def _is_ultra1(self):
|
Chris@87
|
446 return re.match(r'.*Ultra-1', self.info['uname_i']) is not None
|
Chris@87
|
447 def _is_ultra250(self):
|
Chris@87
|
448 return re.match(r'.*Ultra-250', self.info['uname_i']) is not None
|
Chris@87
|
449 def _is_ultra2(self):
|
Chris@87
|
450 return re.match(r'.*Ultra-2', self.info['uname_i']) is not None
|
Chris@87
|
451 def _is_ultra30(self):
|
Chris@87
|
452 return re.match(r'.*Ultra-30', self.info['uname_i']) is not None
|
Chris@87
|
453 def _is_ultra4(self):
|
Chris@87
|
454 return re.match(r'.*Ultra-4', self.info['uname_i']) is not None
|
Chris@87
|
455 def _is_ultra5_10(self):
|
Chris@87
|
456 return re.match(r'.*Ultra-5_10', self.info['uname_i']) is not None
|
Chris@87
|
457 def _is_ultra5(self):
|
Chris@87
|
458 return re.match(r'.*Ultra-5', self.info['uname_i']) is not None
|
Chris@87
|
459 def _is_ultra60(self):
|
Chris@87
|
460 return re.match(r'.*Ultra-60', self.info['uname_i']) is not None
|
Chris@87
|
461 def _is_ultra80(self):
|
Chris@87
|
462 return re.match(r'.*Ultra-80', self.info['uname_i']) is not None
|
Chris@87
|
463 def _is_ultraenterprice(self):
|
Chris@87
|
464 return re.match(r'.*Ultra-Enterprise', self.info['uname_i']) is not None
|
Chris@87
|
465 def _is_ultraenterprice10k(self):
|
Chris@87
|
466 return re.match(r'.*Ultra-Enterprise-10000', self.info['uname_i']) is not None
|
Chris@87
|
467 def _is_sunfire(self):
|
Chris@87
|
468 return re.match(r'.*Sun-Fire', self.info['uname_i']) is not None
|
Chris@87
|
469 def _is_ultra(self):
|
Chris@87
|
470 return re.match(r'.*Ultra', self.info['uname_i']) is not None
|
Chris@87
|
471
|
Chris@87
|
472 def _is_cpusparcv7(self):
|
Chris@87
|
473 return self.info['processor']=='sparcv7'
|
Chris@87
|
474 def _is_cpusparcv8(self):
|
Chris@87
|
475 return self.info['processor']=='sparcv8'
|
Chris@87
|
476 def _is_cpusparcv9(self):
|
Chris@87
|
477 return self.info['processor']=='sparcv9'
|
Chris@87
|
478
|
Chris@87
|
479 class Win32CPUInfo(CPUInfoBase):
|
Chris@87
|
480
|
Chris@87
|
481 info = None
|
Chris@87
|
482 pkey = r"HARDWARE\DESCRIPTION\System\CentralProcessor"
|
Chris@87
|
483 # XXX: what does the value of
|
Chris@87
|
484 # HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0
|
Chris@87
|
485 # mean?
|
Chris@87
|
486
|
Chris@87
|
487 def __init__(self):
|
Chris@87
|
488 if self.info is not None:
|
Chris@87
|
489 return
|
Chris@87
|
490 info = []
|
Chris@87
|
491 try:
|
Chris@87
|
492 #XXX: Bad style to use so long `try:...except:...`. Fix it!
|
Chris@87
|
493 if sys.version_info[0] >= 3:
|
Chris@87
|
494 import winreg
|
Chris@87
|
495 else:
|
Chris@87
|
496 import _winreg as winreg
|
Chris@87
|
497
|
Chris@87
|
498 prgx = re.compile(r"family\s+(?P<FML>\d+)\s+model\s+(?P<MDL>\d+)"\
|
Chris@87
|
499 "\s+stepping\s+(?P<STP>\d+)", re.IGNORECASE)
|
Chris@87
|
500 chnd=winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, self.pkey)
|
Chris@87
|
501 pnum=0
|
Chris@87
|
502 while True:
|
Chris@87
|
503 try:
|
Chris@87
|
504 proc=winreg.EnumKey(chnd, pnum)
|
Chris@87
|
505 except winreg.error:
|
Chris@87
|
506 break
|
Chris@87
|
507 else:
|
Chris@87
|
508 pnum+=1
|
Chris@87
|
509 info.append({"Processor":proc})
|
Chris@87
|
510 phnd=winreg.OpenKey(chnd, proc)
|
Chris@87
|
511 pidx=0
|
Chris@87
|
512 while True:
|
Chris@87
|
513 try:
|
Chris@87
|
514 name, value, vtpe=winreg.EnumValue(phnd, pidx)
|
Chris@87
|
515 except winreg.error:
|
Chris@87
|
516 break
|
Chris@87
|
517 else:
|
Chris@87
|
518 pidx=pidx+1
|
Chris@87
|
519 info[-1][name]=value
|
Chris@87
|
520 if name=="Identifier":
|
Chris@87
|
521 srch=prgx.search(value)
|
Chris@87
|
522 if srch:
|
Chris@87
|
523 info[-1]["Family"]=int(srch.group("FML"))
|
Chris@87
|
524 info[-1]["Model"]=int(srch.group("MDL"))
|
Chris@87
|
525 info[-1]["Stepping"]=int(srch.group("STP"))
|
Chris@87
|
526 except:
|
Chris@87
|
527 print(sys.exc_info()[1], '(ignoring)')
|
Chris@87
|
528 self.__class__.info = info
|
Chris@87
|
529
|
Chris@87
|
530 def _not_impl(self): pass
|
Chris@87
|
531
|
Chris@87
|
532 # Athlon
|
Chris@87
|
533
|
Chris@87
|
534 def _is_AMD(self):
|
Chris@87
|
535 return self.info[0]['VendorIdentifier']=='AuthenticAMD'
|
Chris@87
|
536
|
Chris@87
|
537 def _is_Am486(self):
|
Chris@87
|
538 return self.is_AMD() and self.info[0]['Family']==4
|
Chris@87
|
539
|
Chris@87
|
540 def _is_Am5x86(self):
|
Chris@87
|
541 return self.is_AMD() and self.info[0]['Family']==4
|
Chris@87
|
542
|
Chris@87
|
543 def _is_AMDK5(self):
|
Chris@87
|
544 return self.is_AMD() and self.info[0]['Family']==5 \
|
Chris@87
|
545 and self.info[0]['Model'] in [0, 1, 2, 3]
|
Chris@87
|
546
|
Chris@87
|
547 def _is_AMDK6(self):
|
Chris@87
|
548 return self.is_AMD() and self.info[0]['Family']==5 \
|
Chris@87
|
549 and self.info[0]['Model'] in [6, 7]
|
Chris@87
|
550
|
Chris@87
|
551 def _is_AMDK6_2(self):
|
Chris@87
|
552 return self.is_AMD() and self.info[0]['Family']==5 \
|
Chris@87
|
553 and self.info[0]['Model']==8
|
Chris@87
|
554
|
Chris@87
|
555 def _is_AMDK6_3(self):
|
Chris@87
|
556 return self.is_AMD() and self.info[0]['Family']==5 \
|
Chris@87
|
557 and self.info[0]['Model']==9
|
Chris@87
|
558
|
Chris@87
|
559 def _is_AMDK7(self):
|
Chris@87
|
560 return self.is_AMD() and self.info[0]['Family'] == 6
|
Chris@87
|
561
|
Chris@87
|
562 # To reliably distinguish between the different types of AMD64 chips
|
Chris@87
|
563 # (Athlon64, Operton, Athlon64 X2, Semperon, Turion 64, etc.) would
|
Chris@87
|
564 # require looking at the 'brand' from cpuid
|
Chris@87
|
565
|
Chris@87
|
566 def _is_AMD64(self):
|
Chris@87
|
567 return self.is_AMD() and self.info[0]['Family'] == 15
|
Chris@87
|
568
|
Chris@87
|
569 # Intel
|
Chris@87
|
570
|
Chris@87
|
571 def _is_Intel(self):
|
Chris@87
|
572 return self.info[0]['VendorIdentifier']=='GenuineIntel'
|
Chris@87
|
573
|
Chris@87
|
574 def _is_i386(self):
|
Chris@87
|
575 return self.info[0]['Family']==3
|
Chris@87
|
576
|
Chris@87
|
577 def _is_i486(self):
|
Chris@87
|
578 return self.info[0]['Family']==4
|
Chris@87
|
579
|
Chris@87
|
580 def _is_i586(self):
|
Chris@87
|
581 return self.is_Intel() and self.info[0]['Family']==5
|
Chris@87
|
582
|
Chris@87
|
583 def _is_i686(self):
|
Chris@87
|
584 return self.is_Intel() and self.info[0]['Family']==6
|
Chris@87
|
585
|
Chris@87
|
586 def _is_Pentium(self):
|
Chris@87
|
587 return self.is_Intel() and self.info[0]['Family']==5
|
Chris@87
|
588
|
Chris@87
|
589 def _is_PentiumMMX(self):
|
Chris@87
|
590 return self.is_Intel() and self.info[0]['Family']==5 \
|
Chris@87
|
591 and self.info[0]['Model']==4
|
Chris@87
|
592
|
Chris@87
|
593 def _is_PentiumPro(self):
|
Chris@87
|
594 return self.is_Intel() and self.info[0]['Family']==6 \
|
Chris@87
|
595 and self.info[0]['Model']==1
|
Chris@87
|
596
|
Chris@87
|
597 def _is_PentiumII(self):
|
Chris@87
|
598 return self.is_Intel() and self.info[0]['Family']==6 \
|
Chris@87
|
599 and self.info[0]['Model'] in [3, 5, 6]
|
Chris@87
|
600
|
Chris@87
|
601 def _is_PentiumIII(self):
|
Chris@87
|
602 return self.is_Intel() and self.info[0]['Family']==6 \
|
Chris@87
|
603 and self.info[0]['Model'] in [7, 8, 9, 10, 11]
|
Chris@87
|
604
|
Chris@87
|
605 def _is_PentiumIV(self):
|
Chris@87
|
606 return self.is_Intel() and self.info[0]['Family']==15
|
Chris@87
|
607
|
Chris@87
|
608 def _is_PentiumM(self):
|
Chris@87
|
609 return self.is_Intel() and self.info[0]['Family'] == 6 \
|
Chris@87
|
610 and self.info[0]['Model'] in [9, 13, 14]
|
Chris@87
|
611
|
Chris@87
|
612 def _is_Core2(self):
|
Chris@87
|
613 return self.is_Intel() and self.info[0]['Family'] == 6 \
|
Chris@87
|
614 and self.info[0]['Model'] in [15, 16, 17]
|
Chris@87
|
615
|
Chris@87
|
616 # Varia
|
Chris@87
|
617
|
Chris@87
|
618 def _is_singleCPU(self):
|
Chris@87
|
619 return len(self.info) == 1
|
Chris@87
|
620
|
Chris@87
|
621 def _getNCPUs(self):
|
Chris@87
|
622 return len(self.info)
|
Chris@87
|
623
|
Chris@87
|
624 def _has_mmx(self):
|
Chris@87
|
625 if self.is_Intel():
|
Chris@87
|
626 return (self.info[0]['Family']==5 and self.info[0]['Model']==4) \
|
Chris@87
|
627 or (self.info[0]['Family'] in [6, 15])
|
Chris@87
|
628 elif self.is_AMD():
|
Chris@87
|
629 return self.info[0]['Family'] in [5, 6, 15]
|
Chris@87
|
630 else:
|
Chris@87
|
631 return False
|
Chris@87
|
632
|
Chris@87
|
633 def _has_sse(self):
|
Chris@87
|
634 if self.is_Intel():
|
Chris@87
|
635 return (self.info[0]['Family']==6 and \
|
Chris@87
|
636 self.info[0]['Model'] in [7, 8, 9, 10, 11]) \
|
Chris@87
|
637 or self.info[0]['Family']==15
|
Chris@87
|
638 elif self.is_AMD():
|
Chris@87
|
639 return (self.info[0]['Family']==6 and \
|
Chris@87
|
640 self.info[0]['Model'] in [6, 7, 8, 10]) \
|
Chris@87
|
641 or self.info[0]['Family']==15
|
Chris@87
|
642 else:
|
Chris@87
|
643 return False
|
Chris@87
|
644
|
Chris@87
|
645 def _has_sse2(self):
|
Chris@87
|
646 if self.is_Intel():
|
Chris@87
|
647 return self.is_Pentium4() or self.is_PentiumM() \
|
Chris@87
|
648 or self.is_Core2()
|
Chris@87
|
649 elif self.is_AMD():
|
Chris@87
|
650 return self.is_AMD64()
|
Chris@87
|
651 else:
|
Chris@87
|
652 return False
|
Chris@87
|
653
|
Chris@87
|
654 def _has_3dnow(self):
|
Chris@87
|
655 return self.is_AMD() and self.info[0]['Family'] in [5, 6, 15]
|
Chris@87
|
656
|
Chris@87
|
657 def _has_3dnowext(self):
|
Chris@87
|
658 return self.is_AMD() and self.info[0]['Family'] in [6, 15]
|
Chris@87
|
659
|
Chris@87
|
660 if sys.platform.startswith('linux'): # variations: linux2,linux-i386 (any others?)
|
Chris@87
|
661 cpuinfo = LinuxCPUInfo
|
Chris@87
|
662 elif sys.platform.startswith('irix'):
|
Chris@87
|
663 cpuinfo = IRIXCPUInfo
|
Chris@87
|
664 elif sys.platform == 'darwin':
|
Chris@87
|
665 cpuinfo = DarwinCPUInfo
|
Chris@87
|
666 elif sys.platform.startswith('sunos'):
|
Chris@87
|
667 cpuinfo = SunOSCPUInfo
|
Chris@87
|
668 elif sys.platform.startswith('win32'):
|
Chris@87
|
669 cpuinfo = Win32CPUInfo
|
Chris@87
|
670 elif sys.platform.startswith('cygwin'):
|
Chris@87
|
671 cpuinfo = LinuxCPUInfo
|
Chris@87
|
672 #XXX: other OS's. Eg. use _winreg on Win32. Or os.uname on unices.
|
Chris@87
|
673 else:
|
Chris@87
|
674 cpuinfo = CPUInfoBase
|
Chris@87
|
675
|
Chris@87
|
676 cpu = cpuinfo()
|
Chris@87
|
677
|
Chris@87
|
678 #if __name__ == "__main__":
|
Chris@87
|
679 #
|
Chris@87
|
680 # cpu.is_blaa()
|
Chris@87
|
681 # cpu.is_Intel()
|
Chris@87
|
682 # cpu.is_Alpha()
|
Chris@87
|
683 #
|
Chris@87
|
684 # print 'CPU information:',
|
Chris@87
|
685 # for name in dir(cpuinfo):
|
Chris@87
|
686 # if name[0]=='_' and name[1]!='_':
|
Chris@87
|
687 # r = getattr(cpu,name[1:])()
|
Chris@87
|
688 # if r:
|
Chris@87
|
689 # if r!=1:
|
Chris@87
|
690 # print '%s=%s' %(name[1:],r),
|
Chris@87
|
691 # else:
|
Chris@87
|
692 # print name[1:],
|
Chris@87
|
693 # print
|