Запуск приложения Windows на разных процессорах

Запуск приложения Windows на разных процессорах

Изначальная задача.
Имеется терминальный сервер Windows 2012
Конфигурация состоит из 2-х физических процессоров, 8-ми ядер и 16 логических процессоров.
Пользователи запускают ярлык с рабочего стола.
Приложение, запускаемое пользователями, не оптимизирована на работу с многоядерными процессорами, соответственно при запуске каждого нового экземпляра он ложиться на первый логический процессор.
Основная задача разгрузить CPU0 и задействовать остальные логические процессоры.

Решено сделать выбор процессора случайным образом.
В cmd существует команда start с параметром affinity
affinity работает с логическими процессорами
Чтобы выбрать процессор, необходимо указать его номер в шестнадцатеричном коде

Предположим что имеется 4 логических процессора 0000
Они представляются так:

Работает только первый
0001 ---- 1
Работает только четвертый
1000 ---- 8
Работает первый и третий
0101 ---- 5
Все включены
1111 ---- F

И так далее. Переводить под свои нужды можно онлайн калькуляторами
В нашем случае логических процессоров 16. И программа умеет работать только с одним. Поэтому составим таблицу

Переводим из двоичной системы в шестнадцатиричную

0000000000000001	1
0000000000000010	2
0000000000000100	4
0000000000001000	8
0000000000010000	10
0000000000100000	40
0000000001000000	20
0000000010000000	80
0000000100000000	100
0000001000000000	200
0000010000000000	400
0000100000000000	800
0001000000000000	1000
0010000000000000	2000
0100000000000000	4000
1000000000000000	8000

Скрипт запуска

color F0
echo off
setlocal EnableDelayedExpansion
cls

set /a "CPU_RUN.0=1"
set /a "CPU_RUN.1=2"
set /a "CPU_RUN.2=4"
set /a "CPU_RUN.3=8"
set /a "CPU_RUN.4=10"
set /a "CPU_RUN.5=20"
set /a "CPU_RUN.6=40"
set /a "CPU_RUN.7=80"
set /a "CPU_RUN.8=100"
set /a "CPU_RUN.9=200"
set /a "CPU_RUN.10=400"
set /a "CPU_RUN.11=800"
set /a "CPU_RUN.12=1000"
set /a "CPU_RUN.13=2000"
set /a "CPU_RUN.14=4000"
set /a "CPU_RUN.15=8000"

set /a MIN=0
set /a MAX=15

for /l %%i in ( 0, 1, 4 ) do (
    set /a "RND=MIN+(MAX-MIN+1) * !random!/32768"
    )

start "PROG" /affinity !CPU_RUN.%RND%! "D:\PROG\Prog.exe"

:: echo !CPU_RUN.%RND%!
:: pause

Установка переменной RND делается несколько раз через цикл. Это связано с тем что если указать её один раз, то при тестах из самой оболочки cmd она будет работать. В то время как при запуске мышью, значение всегда будет одно и то же.

Сохраняем скрипт как run_prog.cmd
Можно создать с него ярлык. Сделать иконку соответствующую программе, и поместить на рабочий стол всем терминальным пользователям C:\Users\Public\Desktop\

Пример работы скрипта после внедрения
загрузка процессора
Всплески на графиках означают работу приложения. Изначально первый процессор был загружен по максимуму
PS: В современных приложениях поддержка многопроцессорности указывается при компиляции программы

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *