Caffe2 - C++ API
A deep learning, cross platform ML framework
cpuid.cc
1 
17 #include "caffe2/utils/cpuid.h"
18 
19 namespace caffe2 {
20 
21 const CpuId& GetCpuId() {
22  static CpuId cpuid_singleton;
23  return cpuid_singleton;
24 }
25 
26 CAFFE2_API uint32_t CpuId::f1c_ = 0;
27 CAFFE2_API uint32_t CpuId::f1d_ = 0;
28 CAFFE2_API uint32_t CpuId::f7b_ = 0;
29 CAFFE2_API uint32_t CpuId::f7c_ = 0;
30 
31 CpuId::CpuId() {
32 #ifdef _MSC_VER
33  int reg[4];
34  __cpuid(static_cast<int*>(reg), 0);
35  const int n = reg[0];
36  if (n >= 1) {
37  __cpuid(static_cast<int*>(reg), 1);
38  f1c_ = uint32_t(reg[2]);
39  f1d_ = uint32_t(reg[3]);
40  }
41  if (n >= 7) {
42  __cpuidex(static_cast<int*>(reg), 7, 0);
43  f7b_ = uint32_t(reg[1]);
44  f7c_ = uint32_t(reg[2]);
45  }
46 #elif defined(__i386__) && defined(__PIC__) && !defined(__clang__) && \
47  defined(__GNUC__)
48  // The following block like the normal cpuid branch below, but gcc
49  // reserves ebx for use of its pic register so we must specially
50  // handle the save and restore to avoid clobbering the register
51  uint32_t n;
52  __asm__(
53  "pushl %%ebx\n\t"
54  "cpuid\n\t"
55  "popl %%ebx\n\t"
56  : "=a"(n)
57  : "a"(0)
58  : "ecx", "edx");
59  if (n >= 1) {
60  uint32_t f1a;
61  __asm__(
62  "pushl %%ebx\n\t"
63  "cpuid\n\t"
64  "popl %%ebx\n\t"
65  : "=a"(f1a), "=c"(f1c_), "=d"(f1d_)
66  : "a"(1)
67  :);
68  }
69  if (n >= 7) {
70  __asm__(
71  "pushl %%ebx\n\t"
72  "cpuid\n\t"
73  "movl %%ebx, %%eax\n\r"
74  "popl %%ebx"
75  : "=a"(f7b_), "=c"(f7c_)
76  : "a"(7), "c"(0)
77  : "edx");
78  }
79 #elif defined(__x86_64__) || defined(_M_X64) || defined(__i386__)
80  uint32_t n;
81  __asm__("cpuid" : "=a"(n) : "a"(0) : "ebx", "ecx", "edx");
82  if (n >= 1) {
83  uint32_t f1a;
84  __asm__("cpuid" : "=a"(f1a), "=c"(f1c_), "=d"(f1d_) : "a"(1) : "ebx");
85  }
86  if (n >= 7) {
87  uint32_t f7a;
88  __asm__("cpuid"
89  : "=a"(f7a), "=b"(f7b_), "=c"(f7c_)
90  : "a"(7), "c"(0)
91  : "edx");
92  }
93 #endif
94 }
95 
96 } // namespace caffe2
Copyright (c) 2016-present, Facebook, Inc.