Class: Hardware::CPU

Inherits:
Object
  • Object
show all
Extended by:
T::Sig
Defined in:
hardware.rb,
extend/os/mac/hardware/cpu.rb,
extend/os/linux/hardware/cpu.rb

Overview

Helper module for querying CPU information.

Constant Summary collapse

INTEL_32BIT_ARCHS =
[:i386].freeze
INTEL_64BIT_ARCHS =
[:x86_64].freeze
PPC_32BIT_ARCHS =
[:ppc, :ppc32, :ppc7400, :ppc7450, :ppc970].freeze
PPC_64BIT_ARCHS =
[:ppc64, :ppc64le, :ppc970].freeze
ARM_64BIT_ARCHS =
[:arm64].freeze
ALL_ARCHS =
[
  *INTEL_32BIT_ARCHS,
  *INTEL_64BIT_ARCHS,
  *PPC_32BIT_ARCHS,
  *PPC_64BIT_ARCHS,
  *ARM_64BIT_ARCHS,
].freeze
INTEL_64BIT_OLDEST_CPU =
:core2

Class Method Summary collapse

Class Method Details

.aes?Boolean

Returns:

  • (Boolean)


58
59
60
# File 'extend/os/mac/hardware/cpu.rb', line 58

def aes?
  sysctl_bool("hw.optional.aes")
end

.altivec?Boolean

Returns:

  • (Boolean)


62
63
64
# File 'extend/os/mac/hardware/cpu.rb', line 62

def altivec?
  sysctl_bool("hw.optional.altivec")
end

.amd_family(family) ⇒ Object



76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'extend/os/linux/hardware/cpu.rb', line 76

def amd_family(family)
  case family
  when 0x06
    :amd_k7
  when 0x0f
    :amd_k8
  when 0x10
    :amd_k10
  when 0x11
    :amd_k8_k10_hybrid
  when 0x12
    :amd_k12
  when 0x14
    :bobcat
  when 0x15
    :bulldozer
  when 0x16
    :jaguar
  when 0x17
    :zen
  when 0x19
    :zen3
  end
end

.archObject



73
74
75
76
77
78
79
80
81
82
# File 'hardware.rb', line 73

def arch
  case bits
  when 32
    arch_32_bit
  when 64
    arch_64_bit
  else
    :dunno
  end
end

.arch_32_bitSymbol

Returns:



46
47
48
49
50
51
52
53
54
55
56
# File 'hardware.rb', line 46

def arch_32_bit
  if arm?
    :arm
  elsif intel?
    :i386
  elsif ppc32?
    :ppc32
  else
    :dunno
  end
end

.arch_64_bitSymbol

Returns:



59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'hardware.rb', line 59

def arch_64_bit
  if arm?
    :arm64
  elsif intel?
    :x86_64
  elsif ppc64le?
    :ppc64le
  elsif ppc64?
    :ppc64
  else
    :dunno
  end
end

.arch_flag(arch) ⇒ Object



167
168
169
170
171
# File 'hardware.rb', line 167

def arch_flag(arch)
  return "-mcpu=#{arch}" if ppc?

  "-march=#{arch}"
end

.arm?Boolean

Returns:

  • (Boolean)


147
148
149
# File 'hardware.rb', line 147

def arm?
  type == :arm
end

.avx2?Boolean

Returns:

  • (Boolean)


70
71
72
# File 'extend/os/mac/hardware/cpu.rb', line 70

def avx2?
  sysctl_bool("hw.optional.avx2_0")
end

.avx?Boolean

Returns:

  • (Boolean)


66
67
68
# File 'extend/os/mac/hardware/cpu.rb', line 66

def avx?
  sysctl_bool("hw.optional.avx1_0")
end

.big_endian?Boolean

Returns:

  • (Boolean)


155
156
157
# File 'hardware.rb', line 155

def big_endian?
  [1].pack("I") == [1].pack("N")
end

.bitsObject



107
108
109
110
111
112
# File 'hardware.rb', line 107

def bits
  @bits ||= case RUBY_PLATFORM
  when /x86_64/, /ppc64|powerpc64/, /aarch64|arm64/ then 64
  when /i\d86/, /ppc/, /arm/ then 32
  end
end

.coresObject



99
100
101
102
103
104
105
# File 'hardware.rb', line 99

def cores
  return @cores if @cores

  @cores = Utils.popen_read("getconf", "_NPROCESSORS_ONLN").chomp.to_i
  @cores = 1 unless $CHILD_STATUS.success?
  @cores
end

.extmodelObject



54
55
56
# File 'extend/os/mac/hardware/cpu.rb', line 54

def extmodel
  sysctl_int("machdep.cpu.extmodel")
end

.familySymbol

Returns:



95
96
97
98
99
100
101
102
103
# File 'hardware.rb', line 95

def family
  if arm?
    arm_family
  elsif intel?
    intel_family
  else
    :dunno
  end
end

.feature?(name) ⇒ Boolean

Returns:

  • (Boolean)


163
164
165
# File 'hardware.rb', line 163

def feature?(name)
  features.include?(name)
end

.featuresObject

Compatibility with Mac method, which returns lowercase symbols instead of strings.



109
110
111
112
113
114
115
# File 'extend/os/linux/hardware/cpu.rb', line 109

def features
  @features ||= sysctl_n(
    "machdep.cpu.features",
    "machdep.cpu.extfeatures",
    "machdep.cpu.leaf7_features",
  ).split.map { |s| s.downcase.to_sym }
end

.flagsObject

Supported CPU instructions



102
103
104
105
# File 'extend/os/linux/hardware/cpu.rb', line 102

def flags
  @flags ||= cpuinfo[/^(?:flags|Features)\s*: (.*)/, 1]&.split
  @flags ||= []
end

.in_rosetta2?Boolean

Returns:

  • (Boolean)


38
39
40
# File 'extend/os/mac/hardware/cpu.rb', line 38

def in_rosetta2?
  sysctl_bool("sysctl.proc_translated")
end

.intel?Boolean

Returns:

  • (Boolean)


127
128
129
# File 'hardware.rb', line 127

def intel?
  type == :intel
end

.intel_family(family, cpu_model) ⇒ Object



115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
# File 'extend/os/mac/hardware/cpu.rb', line 115

def intel_family
  case sysctl_int("hw.cpufamily")
  when 0x73d67300 # Yonah: Core Solo/Duo
    :core
  when 0x426f69ef # Merom: Core 2 Duo
    :core2
  when 0x78ea4fbc # Penryn
    :penryn
  when 0x6b5a4cd2 # Nehalem
    :nehalem
  when 0x573b5eec # Westmere
    :westmere
  when 0x5490b78c # Sandy Bridge
    :sandybridge
  when 0x1f65e835 # Ivy Bridge
    :ivybridge
  when 0x10b282dc # Haswell
    :haswell
  when 0x582ed09c # Broadwell
    :broadwell
  when 0x37fc219f # Skylake
    :skylake
  when 0x0f817246 # Kaby Lake
    :kabylake
  when 0x38435547 # Ice Lake
    :icelake
  else
    :dunno
  end
end

.is_32_bit?Boolean

Returns:

  • (Boolean)


119
120
121
# File 'hardware.rb', line 119

def is_32_bit?
  bits == 32
end

.is_64_bit?Boolean

Returns:

  • (Boolean)


123
124
125
# File 'hardware.rb', line 123

def is_64_bit?
  bits == 64
end

.little_endian?Boolean

Returns:

  • (Boolean)


151
152
153
# File 'hardware.rb', line 151

def little_endian?
  !big_endian?
end

.optimization_flagsObject Also known as: generic_optimization_flags



7
8
9
10
11
12
13
# File 'extend/os/linux/hardware/cpu.rb', line 7

def optimization_flags
  @optimization_flags ||= begin
    flags = generic_optimization_flags.dup
    flags[:native] = arch_flag(Homebrew::EnvConfig.arch)
    flags
  end
end

.physical_cpu_arm64?Boolean

NOTE: this is more reliable than checking uname. sysctl returns the right answer even when running in Rosetta 2.

Returns:

  • (Boolean)


88
89
90
# File 'extend/os/mac/hardware/cpu.rb', line 88

def physical_cpu_arm64?
  sysctl_bool("hw.optional.arm64")
end

.ppc32?Boolean

Returns:

  • (Boolean)


135
136
137
# File 'hardware.rb', line 135

def ppc32?
  ppc? && is_32_bit?
end

.ppc64?Boolean

Returns:

  • (Boolean)


143
144
145
# File 'hardware.rb', line 143

def ppc64?
  ppc? && is_64_bit? && big_endian?
end

.ppc64le?Boolean

Returns:

  • (Boolean)


139
140
141
# File 'hardware.rb', line 139

def ppc64le?
  ppc? && is_64_bit? && little_endian?
end

.ppc?Boolean

Returns:

  • (Boolean)


131
132
133
# File 'hardware.rb', line 131

def ppc?
  type == :ppc
end

.sse3?Boolean

Returns:

  • (Boolean)


74
75
76
# File 'extend/os/mac/hardware/cpu.rb', line 74

def sse3?
  sysctl_bool("hw.optional.sse3")
end

.sse4?Boolean

Returns:

  • (Boolean)


115
116
117
# File 'hardware.rb', line 115

def sse4?
  sysctl_bool("hw.optional.sse4_1")
end

.sse4_2?Boolean

Returns:

  • (Boolean)


82
83
84
# File 'extend/os/mac/hardware/cpu.rb', line 82

def sse4_2?
  sysctl_bool("hw.optional.sse4_2")
end

.ssse3?Boolean

Returns:

  • (Boolean)


78
79
80
# File 'extend/os/mac/hardware/cpu.rb', line 78

def ssse3?
  sysctl_bool("hw.optional.supplementalsse3")
end

.typeSymbol

Returns:



13
14
15
16
17
18
19
20
21
22
# File 'extend/os/mac/hardware/cpu.rb', line 13

def type
  case sysctl_int("hw.cputype")
  when MachO::Headers::CPU_TYPE_I386
    :intel
  when MachO::Headers::CPU_TYPE_ARM64
    :arm
  else
    :dunno
  end
end