Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Узнать количество ядер процессора

Ответить
Настройки темы
CMD/BAT - [решено] Узнать количество ядер процессора

Старожил


Сообщения: 415
Благодарности: 257

Профиль | Отправить PM | Цитировать


Не так давно написал скрипт, скачивающий выбранный плейлист с YouTube, в своей работе он использует разделение задач пусть на примитивные, но всё же потоки, и распределяет оные по ядрам процессора. Хотелось бы его усовершенствовать и добавить автоматическое определение количества ядер (скрипт запускается на разных ПК с абсолютно неидентичным железом), но проблема в том, что я не знаю, как это реализовать. Подозреваю, что силами WMIC, но я не силён в нём. Надеюсь на помощь форумчан.
На всякий случай привожу сам скрипт:
читать дальше »
Код: Выделить весь код
@Echo Off
SetLocal EnableDelayedExpansion
:: YTDownloader v1.4
:: Anonymous, 2013. Ad majorem Applejack gloriam
:: Distributed under WTFPL license (http://www.wtfpl.net/)
:: Скрипт, скачивающий выбранный плейлист с ютуба в виде mp3
:: Работа с YouTube ведется через собственный API (тоже на батниках). Документация по API: http://ponyasha.tk/api/
:: Зависимости: wget (http://gnuwin32.sourceforge.net/packages/wget.htm) aria2 (http://aria2.sourceforge.net/)
:: Почему две утилиты для одной и той же цели? Aria не умеет писать данные в stdout, а wget скачивает в один поток
:: Да-да, реализована многопоточность и распределение процессов по ядрам. inb4: месье знает толк в извращениях


::==================================
:: Настройки
::==================================
:: Число потоков (обычно вполне хватает пяти)
Set Threads=5
:: Число используемых ядер процессора (не больше четырех)
Set Cores=4
:: Домен, на котором расположены используемые API
Set APIBaseURL=http://ponyasha.tk


::==================================
:: Обработчик параметров командной строки
::==================================
If "%~1"=="" Echo    USAGE: %~nx0 ^<YouTube playlist ID^>&Exit /B
If "%~1"=="thread" GoTo Thread

::==================================
:: Работа с данными плейлиста
::==================================
:: Подготовка
If Not Exist audio MD audio
For /F "delims=" %%A In ('Dir "%Temp%\thread*.lock" /B 2^>nul') Do (Del "%Temp%\%%A")
If Exist "%Temp%\ytplaylist.txt" Del "%Temp%\ytplaylist.txt"
:: Получение ID видео
Set i=0
For /F "eol= delims=" %%A In ('wget "!APIBaseURL!/api/ytplist.bat?list=%~1" -q -O- 2^>nul') Do (
	For %%B In (%%A) Do (
		If "%%~B"=="Error:" Echo    ERROR: Ivalid playlist ID or empty playlist&Exit /B
		Echo %%~B>>"%Temp%\ytplaylist.txt"
		Set /A i+=1
	)
)

::==================================
:: Балансировка нагрузки
::==================================
:: Считаем количество заданий на поток
Set /A JobsPerThread=i/Threads
:: Проверяем на деление без остатка и распределяем диапазоны
Set /A Mod=JobsPerThread*Threads
For /L %%A In (1,1,!Threads!) Do (
	Set /A Prev=%%A-1
	Set /A Thread[%%A]min=Thread[!Prev!]max+1
	Set /A Thread[%%A]max=JobsPerThread*%%A
)
:: Если поровну между потоками не делится, добавляем остаток к последнему
If Not "!Mod!"=="!i!" Set /A  Thread[%Threads%]max=i-Mod+!Thread[%Threads%]max!
:: Если заданий меньше чем потоков, принудительно переводим в однопоточный режим
If !i! LSS !Threads! (
	Set Thread[1]min=1
	Set Thread[1]max=!i!
	Set Threads=1
)
:: Распределяем потоки по ядрам (само собой, вместе с дочерними процессами)
If !Cores! GTR 4 Set Cores=4
Set Core=1&Set CoreID=1
For /L %%A In (1,1,!Threads!) Do (
	Set Thread[%%A]core=!CoreID!
	Call :AffinityMap
)
:: Вызываем потоки (копии самого себя, работающие в том же окне)
Echo    YTDownload started
Echo    INFO: !i! videos ready to processing
Echo v:0>"%Temp%\progress.data"
For /L %%A In (1,1,!Threads!) Do (
	Start /B /affinity !Thread[%%A]core! %~nx0 thread !Thread[%%A]min!:!Thread[%%A]max! %%A !i!
)
:: Ожидание окончания всех потоков (интервал проверки - ~2 секунды)
:ThreadWatcher
Set AllDone=true
Ping -n 3 127.0.0.1>nul
For /L %%A In (1,1,!Threads!) Do (If Exist "%Temp%\thread%%A.lock" Set AllDone=false)
If "!AllDone!"=="false" GoTo ThreadWatcher
:: Завершение работы
Echo    INFO: All threads finished
Del "%Temp%\ytplaylist.txt"
Exit /B

::==================================
:: Отдельный поток
::==================================
:Thread
:: Разбираем аргументы
Set ThreadNum=%~3
Set Videos=%~4
For /F "tokens=1,2 delims=:" %%A In ("%~2") Do (Set Min=%%A&Set Max=%%B)
:: Ставим локфайл
Echo.>"%Temp%\thread!ThreadNum!.lock"
:: Получаем только принадлежащие потоку данные
Set i=0
For /F "usebackq eol= delims=" %%A In ("%Temp%\ytplaylist.txt") Do (
	Set /A i+=1
	If !i! GEQ !Min! If !i! LEQ !Max! (
		Set Err=0
		For /F "eol= delims=" %%B In ('wget "!APIBaseURL!/api/yt2mp3.bat?v=%%A" -q -O- 2^>nul') Do (Set AudioURL=%%B)
		:: Вывод сообщения о ошибке, генерируемого самим API
		If "!AudioURL:~,6!"=="Error:" Echo    ERROR: [%%A]!AudioURL:~6!&Set Err=1
		If !Err!==0 (
			:: Получение имени скачиваемого файла
			For /F "eol= delims=" %%A In ("!AudioURL:/=\!") Do Set AudioName=%%~nxA
			:: Сокращение отображаемых данных
			Set DisplayedURL=!AudioURL!
			If Not "!DisplayedURL!"=="!DisplayedURL:~-40!" Set DisplayedURL=!DisplayedURL:~,25!...!DisplayedURL:~-10!
			If Not "!AudioName!"=="!AudioName:~-40!" Set AudioName=!AudioName:~,25!...!AudioName:~-10!
			:: Инкрементация счетчика обработанных видео
			For /F "usebackq tokens=2 delims=:" %%A In ("%Temp%\progress.data") Do (
				Set /A Progress=%%A+1
				Echo v:!Progress!>"%Temp%\progress.data"
				Set /A Percentage=!Progress!*100/!Videos!
				Title [!Progress!/!Videos!] !Percentage!%%
			)
			:: Многопоточное скачивание
			Echo    [!Progress!/!Videos!] !Percentage!%% Thread #!ThreadNum!: Downloading !DisplayedURL!
			aria2c -j 10 -x 10 -s 10 --allow-overwrite=true -D -d "audio" "!AudioURL!">nul
			Echo    Thread #!ThreadNum!: Succesfuly downloaded: !AudioName!
			
		)
	)
)
:: Убираем локфайл и убиваем поток
Del "%Temp%\thread!ThreadNum!.lock"
Echo    INFO: Thread !ThreadNum! finished
Exit

::==================================
:: Вспомогательные функции
::==================================
:AffinityMap
:: Получаем ID следующего ядра
If !Cores!==1 Set CoreID=1&Exit /B
Set /A CoreID="1<<Core"
Set /A Core+=1
If !Core!==!Cores! Set Core=0
Exit /B

Отправлено: 21:00, 10-07-2013

 

Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Не забывайте про HT.
Код: Выделить весь код
wmic.exe CPU get NumberOfCores, NumberOfLogicalProcessors
Может возвращать некорректный результат, потребны обновления: Win32_Processor NumberOfCores|NumberOfLogicalProcessors site:support.microsoft.com - Поиск в Google.
Это сообщение посчитали полезным следующие участники:

Отправлено: 21:25, 10-07-2013 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Старожил


Сообщения: 352
Благодарности: 119

Профиль | Отправить PM | Цитировать


echo %NUMBER_OF_PROCESSORS%
Это сообщение посчитали полезным следующие участники:

Отправлено: 01:48, 11-07-2013 | #3


Пользователь


Сообщения: 64
Благодарности: 1

Профиль | Отправить PM | Цитировать


Это количество ядер или потоков ?

Както на основе этого можно вычислить именно количество ядер ?
Я не знаю как именно у процей теперь, говорят i3 стали 4 ядерными.
В общем надо както узнать если ядер всего 2, то запустить на одном.
Предположим 4 потока, значит 2 ядра, запускаем в 2 потока чтоб работало на 1 ядре, забирать 2 это перебор.
Но если 4 ядра 4 потока, то желательно бы запустить на 2 ядрах или 3, вот в этом то и неувязка получается.
Проще наверно будет просто оставить 2 потока, а остальные занять

Отправлено: 06:26, 20-12-2017 | #4


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


LEmiD, «И ты, Брут?». На своей машине можно и глазками посмотреть. А на чужой… Ну, зачем это Вам?!

Отправлено: 07:49, 20-12-2017 | #5


Ветеран


Сообщения: 1274
Благодарности: 564

Профиль | Отправить PM | Цитировать


LEmiD,
не каждый проц вы уговорите работать с ядрами по вашему желанию, что-то на ядро ОС скинет без вашего ведома и желания.

Отправлено: 14:46, 20-12-2017 | #6


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


alpap, я так чую — это всё те же майнеры с запуском на чужих машинах, ОС тут не причём. Просто навскидку пробежитесь по последним двум десяткам сообщений коллеги LEmiD.

Отправлено: 15:10, 20-12-2017 | #7


Пользователь


Сообщения: 64
Благодарности: 1

Профиль | Отправить PM | Цитировать


Скрытый текст
Как вы блин цвет выбираете, тут же нет палитры, ладно у меня в трее instant eyedropper завалялся и случайно открытая серая палитре потомучто впервые за месяци на одном форуме решил написать строчку палитрой, а тамашних цветов маловато, но они есть
это всё те же майнеры с запуском на чужих машинах
пробежитесь по последним двум десяткам сообщений коллеги


Любой кусок майнера палит любой антивирус. Кроме защитника, не хочет чтоб втискивали.
Вовсе не десяток, тем 5 максимум, и вообще в обучающих целях, пока интерес не пропал. Просто я криворук и ничё не доделываю когда результат известен.


Просто думал о интелах, а тут амд вспомнил, наверно ну их нахрен. Я даже не знаю у них тоже по 2 потока на ядро или им своих 16 ядер хватает?

Отправлено: 19:20, 20-12-2017 | #8


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата LEmiD:
и вообще в обучающих целях, пока интерес не пропал. »
Тогда, пожалуй, стоит ограничить достижение этих целей собственной машиной.

Цитата LEmiD:
Как вы блин цвет выбираете, тут же нет палитры, »
Вот так

Отправлено: 19:53, 20-12-2017 | #9


Ветеран


Сообщения: 1274
Благодарности: 564

Профиль | Отправить PM | Цитировать


Цитата Iska:
тут же нет палитры »
Отчего же

["color=blue"]Этот текст синий["/color"]
(убрать кавычки для внедрения)

Отправлено: 01:21, 21-12-2017 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Узнать количество ядер процессора

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
[решено] Расхождение температур ядер и общей температуры процессора sashadeg Процесcоры 22 11-04-2015 09:50
CMD/BAT - [решено] узнать количество файлов в каталоге через CMD toro Скриптовые языки администрирования Windows 5 04-12-2013 06:31
температура ядер двухядерного процессора basewe Процесcоры 9 22-04-2013 20:21
Разное - [решено] Замена процессора с увеличением количества ядер Grosvold Microsoft Windows 7 20 16-08-2011 16:59
Разное - [решено] Выбор кол-ва ядер процессора для процесса. Balancer Microsoft Windows 2000/XP 3 19-04-2010 23:30




 
Переход