Значение CRYSTAL_WORKERS по умолчанию, равное 4, кажется слишком низким для приложения Crystal-lang? Кто-нибудь еще ориентир выше?

Я очень рад, что в Crystal-lang появилась многопоточность. Кто-нибудь еще проводил многопоточный бенчмаркинг для Crystal-lang; если да, то какие CRYSTAL_WORKERS, по вашему мнению, оказались полезными для того, что вы сравнивали? (Да, я знаю, что каждый тест отличается, поэтому пробег может отличаться.)

Значение по умолчанию для CRYSTAL_WORKERS равно 4, но кажется, что должно быть больше, по крайней мере, на высокоядерных системах. Могут ли тесты, которые привели к этому значению 4, быть связаны с побочным эффектом количества ядер, используемых в то время, или с чем-то еще?

Я провел несколько сравнений Фибоначчи на 8-ядерном (Intel) и 16-ядерном (AMD) ЦП и получил несколько больших пиков и впадин (https://github.com/drhuffman12/bench_vs/blob/master/threads/README.md ). (Для простых вычислений/преобразований накладные расходы на волокна/и т.д. кажутся нецелесообразными, но для более ресурсоемкого кода, такого как вычисления Фибиначчи, волокна с более высокими значениями CRYSTAL_WORKERS и same_thread: false кажутся потенциально полезными.)


person Daniel Huffman    schedule 21.10.2019    source источник
comment
Возможно, лучший вопрос для форума. На самом деле у нас есть существующее обсуждение бенчмаркинга поддержка многопоточности.   -  person Jonne Haß    schedule 21.10.2019


Ответы (1)


На этот вопрос нет ответа. Количество рабочих сильно зависит от типа приложения и доступности/управления ресурсами в системе выполнения.

Конечно, когда ваша система имеет более 4 ядер, вам нужно большее число, чтобы использовать больше доступной вычислительной мощности. Но вам не обязательно загружать все ядра, в зависимости от того, что еще работает в системе. Приложения, особенно связанные с вводом-выводом, не обязательно выиграют от слишком большого количества рабочих потоков. Так что установка CRYSTAL_WORKERS=$(nprocs), вероятно, не очень хорошая идея.

CRYSTAL_WORKERS=4 — это просто значение по умолчанию, потому что оно должно быть. Это довольно распространенное значение по умолчанию, потому что а) оно должно обеспечить разумное улучшение по сравнению с однопоточным выполнением и б) современные процессоры обычно имеют не менее 4 ядер.

Всякий раз, когда вы развертываете приложение в системе выполнения, вам необходимо учитывать, какой рабочий номер подходит для этой конкретной среды, и соответствующим образом настраивать его. Использование другого значения по умолчанию никак не поможет.

person Johannes Müller    schedule 21.10.2019