[ID CC-CC2022] Определение количества ядер CPU

  • Автор темы Автор темы veretragna
  • Дата начала Дата начала

veretragna

γνώσις
Топикстартер
Сообщения
578
Реакции
200
Здравствуйте.
Я задался целью оптимизировать скрипт пакетного экспорта PDF, чтобы InDesign экспортировал не в один поток по очереди, а в 4 потока на 4-ядерных процессорах. На данный момент бета-версия скрипта работает и жестко зафиксирована на 4 ядрах, а хочется, чтобы максимальное количество потоков выводилось из количества ядер CPU в системе.
Есть ли способ получить количество ядер CPU в системе средствами скрипта?
В структуре PerformanceMetricOptions искомого не нашел.
 
Примитивный балансировщик задач (цикл while), а задачи имеют вид document.asynchronousExportFile().
Вот выдрал кусок функции наживо, но принцип понятен.
Все asynchronousExportFile() выполняются на своих ядрах, если ядер достаточно, загрузка CPU 100%

JavaScript:
while (1) {
    $.sleep(1000);
    if (app.backgroundTasks.count() < maxThreads) break;
}

doc.asynchronousExportFile(ExportFormat.pdfType, File (fullName), false, myPDFExportPreset);
 
Последнее редактирование:
Это скрипт пакетного экспорта, обрабатывается множество таких мелких задач.
 
А если нужно после экспорта закрыть документ?
 
asynchronousExportFile() возвращает backgroundTask.
Написать более продвинутый балансировщик с таблицей, обходить задания и вызывать doc.close() по завершении операции.
Этот конкретный скрипт разбирает один документ индизайна на части, поэтому закрывать пока ничего не надо. Но при необходимости можно озадачиться и закрытием, почему бы и нет
 
Последнее редактирование:

Не по теме:
Уважаемый @veretragna!
Хочу поблагодарить вас за эту тему. Вы сделали день мне, забаненному @_MBK_ и многим другим людям, что не захотели быть названными.
Вы прелесть!

 
  • Спасибо
Реакции: _MBK_ и Skvoznyak

Не по теме:
Если это не сарказм, то спасибо ;)
 
Это не совсем сарказм, это, скорее, искреннее восхищение чистыми и наивными помыслами.
Как бы это вам пояснить...
Нельзя управлять компрессией в цилиндре автомобиля китайским чудо-прикуривателем.
Нельзя разгонять облака, размахивая библией с колокольни.
 
Последнее редактирование:
Стоп, это почему же нельзя?
Я хочу сделать одновременный экспорт в 4 потока вместо одного и я это сделал.
Вопрос сугубо технический - как подстроить количество потоков под количество ядер.

Надо заставить работать вот эту хреновину и дело будет сделано
JavaScript:
var vbscript = 'Set wbemFlagReturnImmediately = &h10\r' +
'Set wbemFlagForwardOnly = &h20\r' +
'Set strComputer = "."\r' +
'Set objWMIService = GetObject("winmgmts:\\\\" & strComputer & "\\root\\CIMV2")\r' +
'Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_Processor", "WQL", wbemFlagReturnImmediately + wbemFlagForwardOnly)\r' +
'For Each objItem In colItems\r' +
'returnValue = objItem.NumberOfCores\r' +
'Next';

var cpuCores = app.doScript(vbscript,ScriptLanguage.VISUAL_BASIC);
 
Вопрос сугубо технический - как подстроить количество потоков под количество ядер.
Этот вопрос равносилен "какой рукой махать и круговыми или поступательно-возвратными движениями?"
 
Потоки нужно ограничивать. Я когда-то экспериментировал с asynchronousExportFile(), и если все потоки запустить одновременно без ручного планирования, они вешают индизайн наглухо и висят как "queued".
 
Потоки нужно ограничивать. Я когда-то экспериментировал с asynchronousExportFile(), и если все потоки запустить одновременно без ручного планирования, они вешают индизайн наглухо и висят как "queued".
У меня, судя по всему, не настолько глубокие познания в адобовской явамашине, как у вас, но растолкуйте мне, откуда такая уверенность, что вы управляете потоками?
 
Я слежу за загрузкой физических ядер через виджет.
Процессор с Hyperthreading, 4 потока загружают равномерно 4 ядра, линии распределяются в середине графика.
8 потоков загружают процессор полностью, линии находятся вверху графика.

Скриншот для наглядности, почти без нагрузки
 

Вложения

  • 2019-09-05_132727.png
    2019-09-05_132727.png
    32.6 КБ · Просм.: 382
Вот, пожалуйста, экспорт в 3 потока - стабильно загружены 3 ядра
 

Вложения

  • 2019-09-05_132727.png
    2019-09-05_132727.png
    35.8 КБ · Просм.: 218
Кажись понял. Вы путаете Thread и Task, а хотелка сводится к одновременному запуску задач экспорта, равному количеству ядер в процессоре?
 
Последнее редактирование:
Нет, я думаю, что каждый backgroundTask выполняется в своем thread без жестко заданной affinity, потому что загрузка ядер постоянно меняется, но нагружены всегда 3.
Или у InDesign есть thread workers на этот случай, и их какое-то конечное количество.

Конкретно сейчас он не дает экспортировать в больше 4 потоков одновременно, остальные queued, но при экспорте в 4 потока все ядра имеют нагрузку:

2019-09-05_135121.png

А проблема в том, что встроенный планировщик не справляется. Если все задания подать на него сразу, InDesign виснет.
Мне нужно ограничить количество потоков до количества ядер.
 
Предыдущий скриншот неудачный, я запустил экспорт на первом попавшемся проекте, а там полтора гигабайта графики.
Индизайн не успевал читать данные с диска и не нагружал положенные 3 ядра полностью.

Вот скриншот на обычном текстовом проекте, экспорт в 3 потока
 

Вложения

  • 22222.png
    22222.png
    33.5 КБ · Просм.: 364
Если доказательств все еще недостаточно, давайте продолжим дискуссию.
 
Ну спросите при первом запуске сколько тасков одновременно запускать, да сохраните в ини файл