This repository has been archived on 2023-02-09. You can view files and clone it, but cannot push or open issues or pull requests.
Files
blender-benchmark-bundle/benchmark/foundation/system_info.py
Sergey Sharybin 7f42fdf5e8 Initial implementation of blender benchmark addon
Just some glue logic to query progress and results from benchmark.

Needed to move files around, so oth standalone and addon are happy.
2018-08-02 17:38:55 +02:00

109 lines
3.6 KiB
Python

import json
import multiprocessing
import os
import platform
import subprocess
import sys
# Usually comes from third_party
from .third_party import cpuinfo
from .third_party import cpu_cores
def _getBlenderDeviceInfo(ctx):
PREFIX = "Benchmark Devices: "
command = [ctx.blender,
"--background",
"--factory-startup",
"-noaudio",
"--enable-autoexec",
"--engine", "CYCLES",
"--python", ctx.configure_script,
"--",
"--benchmark-system-info"]
process = subprocess.Popen(command,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
stdout, stderr = process.communicate()
lines = stdout.decode().split("\n")
for line in lines:
if line.startswith(PREFIX):
return json.loads(line[len(PREFIX):])
return []
def getBlenderVersion(ctx):
INFO = ("build_date",
"build_time",
"build_commit_date",
"build_commit_time",
"build_hash")
command = [ctx.blender, "--background", "--version"]
process = subprocess.Popen(command,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
stdout, stderr = process.communicate()
lines = stdout.decode().split("\n")
info = {}
for line in lines:
line = line.strip()
if line.startswith("Blender "):
version = line[8:].strip()
info['version'] = version
if not line.startswith("build "):
continue
tokens = line.split(":", 1)
tokens[0] = tokens[0].replace(" ", "_")
if tokens[0] in INFO:
info[tokens[0]] = tokens[1].strip()
return info
def _getWmicCPUInfo(value):
cmd = ("wmic", "cpu", "get", value, "/value")
wmic_output = subprocess.check_output(cmd)
return wmic_output.strip().decode()
def _getCPUTopologyInformation():
"""
Get topology information (number of sockets, physical and logical threads)
of the system CPUs.
"""
import multiprocessing
topology_info = {}
topology_info["num_logical_threads"] = multiprocessing.cpu_count()
if not sys.platform.startswith('win'):
cores_info = cpu_cores.CPUCoresCounter.factory()
topology_info["num_sockets"] = \
cores_info.get_physical_processors_count()
topology_info["num_physical_cores"] = \
cores_info.get_physical_cores_count()
else:
num_cores = _getWmicCPUInfo("NumberOfCores").split("=")[1]
# TODO(sergey): Needs implementation.
topology_info["num_sockets"] = 1
topology_info["num_physical_cores"] = num_cores
return topology_info
def gatherSystemInfo(ctx):
system_info = {}
system_info['bitness'] = platform.architecture()[0]
system_info['machine'] = platform.machine()
system_info['system'] = platform.system()
if system_info['system'] == "Linux":
distro = platform.linux_distribution()
system_info['dist_name'] = distro[0]
system_info['dist_version'] = distro[1]
# system_info['libc_version'] = "-".join(platform.libc_ver())
# TODO(sergey): Make this to work on Windows and macOS
cpu_info = cpuinfo.get_cpu_info()
cpu_topology = _getCPUTopologyInformation()
system_info['cpu_brand'] = cpu_info['brand']
system_info["num_cpu_threads"] = cpu_topology['num_logical_threads']
system_info["num_cpu_sockets"] = cpu_topology['num_sockets']
system_info["num_cpu_cores"] = cpu_topology['num_physical_cores']
system_info['devices'] = _getBlenderDeviceInfo(ctx)
return system_info