From 831863ca59ba95001f02cf6b02e0d8bab15df785 Mon Sep 17 00:00:00 2001 From: Kolan Sh Date: Thu, 7 Apr 2011 18:59:45 +0400 Subject: [PATCH] =?UTF-8?q?affinity=20=D0=B4=D0=BB=D1=8F=20starcraft=20II?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cpp/affinity/affinity | Bin 0 -> 13787 bytes cpp/affinity/affinity.cpp | 126 ++++++++++++++++++++++++++++++++++++++ cpp/affinity/d3d_sc2.reg | 9 +++ cpp/affinity/sc2.sh | 15 +++++ 4 files changed, 150 insertions(+) create mode 100755 cpp/affinity/affinity create mode 100644 cpp/affinity/affinity.cpp create mode 100644 cpp/affinity/d3d_sc2.reg create mode 100755 cpp/affinity/sc2.sh diff --git a/cpp/affinity/affinity b/cpp/affinity/affinity new file mode 100755 index 0000000000000000000000000000000000000000..8885f0c875191e9157afbec68cc4c21d00746878 GIT binary patch literal 13787 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 OwI~+B&z76wv-%%?$H2t^ literal 0 HcmV?d00001 diff --git a/cpp/affinity/affinity.cpp b/cpp/affinity/affinity.cpp new file mode 100644 index 0000000..36e226d --- /dev/null +++ b/cpp/affinity/affinity.cpp @@ -0,0 +1,126 @@ +/* + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + (c) 2011 Emanuele Oriani - ema at fastwebnet dot it +*/ + +#include +#include +#include +#include + +static pid_t pid = -1; +static int cpu = -1; +static bool reset = false; +static bool cpunum = false; + +// To get the number of available CPUs we run this +// getaffinity BEFORE setting any affinity mask. +// We will get all the available CPUs. +static int num_cpus(void) { + cpu_set_t cpu_set; + CPU_ZERO(&cpu_set); + const int max_cpus = 8*sizeof(cpu_set); + if (0 == sched_getaffinity(getpid(), sizeof(cpu_set_t), &cpu_set)) { + for(int i = 0; i < max_cpus; ++i) + if (!CPU_ISSET(i, &cpu_set)) return i; + } + return max_cpus; +} + +const int NCPUS = num_cpus(); + +static void usage(const char *img) { + std::cerr << img << ", a simple program to set CPU affinity on Linux." << std::endl; + std::cerr << "(c) 2011 Emanuele Oriani - ema at fastwebnet dot it" << std::endl; + std::cerr << "\nUsage:" << std::endl; + std::cerr << " " << img << " [-p pid] [-c cpu] [-r]" << std::endl; + std::cerr << " p: specify a process pid" << std::endl; + std::cerr << " c: specify a cpu id (0-n)" << std::endl; + std::cerr << " r: reset (enable all cpus)" << std::endl; + std::cerr << " g: print cpus number" << std::endl; +} + +static void opts(int argc, char *argv[]) { + extern char *optarg; + int res = -1; + while(EOF != (res = getopt(argc, argv, "p:c:rhg"))) { + switch((char)res) { + case 'p': + pid = (pid_t)std::atoi(optarg); + break; + case 'c': + cpu = std::atoi(optarg); + break; + case 'r': + reset = true; + break; + case 'g': + cpunum = true; + break; + case 'h': + default: + usage(argv[0]); + std::exit(-2); + break; + } + } +} + +int main(int argc, char *argv[]) { + opts(argc, argv); + cpu_set_t cpu_set; + if (cpunum) std::cout << "Available cpus: " << NCPUS << '.' << std::endl; + if (-1 == pid) pid = getpid(); + if (reset || (-1 != cpu)) { + CPU_ZERO(&cpu_set); + if (reset) { + for(int i = 0; i < NCPUS; ++i) + CPU_SET(i, &cpu_set); + } + else CPU_SET(cpu, &cpu_set); + if (-1 == sched_setaffinity(pid, sizeof(cpu_set_t), &cpu_set)) { + std::cerr << "Error : "; + switch(errno) { + case EFAULT: + std::cerr << "A supplied memory address was invalid." << std::endl; + std::exit(-1); + break; + case EINVAL: + std::cerr << "The affinity bitmask mask contains no processors that are physically on the system, or cpusetsize is smaller than the size of the affinity mask used by the kernel." << std::endl; + std::exit(-1); + break; + case EPERM: + std::cerr << "The calling process does not have appropriate privileges." << std::endl; + std::exit(-1); + break; + case ESRCH: + std::cerr << "The process whose ID is " << pid << " could not be found." << std::endl; + std::exit(-1); + break; + default: + std::cerr << "Unknown error." << std::endl; + std::exit(-1); + break; + } + } + } + + CPU_ZERO(&cpu_set); + if (0 == sched_getaffinity(pid, sizeof(cpu_set_t), &cpu_set)) { + std::cout << "Report:" << std::endl; + for(int i = 0; i < NCPUS; ++i) + if (CPU_ISSET(i, &cpu_set)) std::cout << "Cpu " << i << " is set." << std::endl; + } +} diff --git a/cpp/affinity/d3d_sc2.reg b/cpp/affinity/d3d_sc2.reg new file mode 100644 index 0000000..f0e617d --- /dev/null +++ b/cpp/affinity/d3d_sc2.reg @@ -0,0 +1,9 @@ +REGEDIT4 + +[HKEY_CURRENT_USER\Software\Wine\Direct3D] +"DirectDrawRenderer"="opengl" +"Multisampling"="disabled" +"OffScreenRenderingMode"="pbuffer" +"UseGLSL"="disabled" +"VertexShaderMode"="hardware" +"VideoMemorySize"="768" diff --git a/cpp/affinity/sc2.sh b/cpp/affinity/sc2.sh new file mode 100755 index 0000000..432dd3f --- /dev/null +++ b/cpp/affinity/sc2.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +cd ~/.wine/drive_c/Games/StarCraft2 +(wine StarCraft\ II &>/dev/null)& +cd ~/scripts/sc2 + +for i in `seq 20`; do + sleep 60 + + sc2_pid=`pgrep "SC2.exe"` + if [ "$sc2_pid" != "" ]; then + echo "Setting SC2 ($sc2_pid) affinity to CPU 1" 1>&2 + ./affinity -p "$sc2_pid" -c 3 + fi +done