module Parallel::ProcessorCount

Public Instance Methods

physical_processor_count() click to toggle source

Number of physical processor cores on the current system.

# File lib/parallel/processor_count.rb, line 55
def physical_processor_count
  @physical_processor_count ||= begin
    ppc = case RbConfig::CONFIG["target_os"]
    when /darwin1/
      IO.popen("/usr/sbin/sysctl -n hw.physicalcpu").read.to_i
    when /linux/
      cores = {}  # unique physical ID / core ID combinations
      phy = 0
      IO.read("/proc/cpuinfo").scan(/^physical id.*|^core id.*/) do |ln|
        if ln.start_with?("physical")
          phy = ln[/\d+/]
        elsif ln.start_with?("core")
          cid = phy + ":" + ln[/\d+/]
          cores[cid] = true if not cores[cid]
        end
      end
      cores.count
    when /mswin|mingw/
      require 'win32ole'
      result_set = WIN32OLE.connect("winmgmts://").ExecQuery(
        "select NumberOfCores from Win32_Processor")
      result_set.to_enum.collect(&:NumberOfCores).reduce(:+)
    else
      processor_count
    end
    # fall back to logical count if physical info is invalid
    ppc > 0 ? ppc : processor_count
  end
end
processor_count() click to toggle source

Number of processors seen by the OS and used for process scheduling.

  • AIX: /usr/sbin/pmcycles (AIX 5+), /usr/sbin/lsdev

  • BSD: /sbin/sysctl

  • Cygwin: /proc/cpuinfo

  • Darwin: /usr/bin/hwprefs, /usr/sbin/sysctl

  • HP-UX: /usr/sbin/ioscan

  • IRIX: /usr/sbin/sysconf

  • Linux: /proc/cpuinfo

  • Minix 3+: /proc/cpuinfo

  • Solaris: /usr/sbin/psrinfo

  • Tru64 UNIX: /usr/sbin/psrinfo

  • UnixWare: /usr/sbin/psrinfo

# File lib/parallel/processor_count.rb, line 17
def processor_count
  @processor_count ||= begin
    os_name = RbConfig::CONFIG["target_os"]
    if os_name =~ /mingw|mswin/
      require 'win32ole'
      result = WIN32OLE.connect("winmgmts://").ExecQuery(
        "select NumberOfLogicalProcessors from Win32_Processor")
      result.to_enum.collect(&:NumberOfLogicalProcessors).reduce(:+)
    elsif File.readable?("/proc/cpuinfo")
      IO.read("/proc/cpuinfo").scan(/^processor/).size
    elsif File.executable?("/usr/bin/hwprefs")
      IO.popen("/usr/bin/hwprefs thread_count").read.to_i
    elsif File.executable?("/usr/sbin/psrinfo")
      IO.popen("/usr/sbin/psrinfo").read.scan(/^.*on-*line/).size
    elsif File.executable?("/usr/sbin/ioscan")
      IO.popen("/usr/sbin/ioscan -kC processor") do |out|
        out.read.scan(/^.*processor/).size
      end
    elsif File.executable?("/usr/sbin/pmcycles")
      IO.popen("/usr/sbin/pmcycles -m").read.count("\n")
    elsif File.executable?("/usr/sbin/lsdev")
      IO.popen("/usr/sbin/lsdev -Cc processor -S 1").read.count("\n")
    elsif File.executable?("/usr/sbin/sysconf") and os_name =~ /irix/i
      IO.popen("/usr/sbin/sysconf NPROC_ONLN").read.to_i
    elsif File.executable?("/usr/sbin/sysctl")
      IO.popen("/usr/sbin/sysctl -n hw.ncpu").read.to_i
    elsif File.executable?("/sbin/sysctl")
      IO.popen("/sbin/sysctl -n hw.ncpu").read.to_i
    else
      $stderr.puts "Unknown platform: " + RbConfig::CONFIG["target_os"]
      $stderr.puts "Assuming 1 processor."
      1
    end
  end
end