Afaik: Оптимальна кількість потоків для даних, що підходить для паралельної обробки, - це кількість ядер - оскільки кожен потік має (теоретично) власне ядро, на якому слід працювати. Для центральних процесорів, які здатні до гіперструзії, це 2 рази кількість ядер. Будь ласка, виправте мене, якщо я помиляюся.
Моє питання, чи лежить в основі ОС (Linux,Winodws OSX) автоматично реалізує мій "намір" і, напр. присвоює кожну нитку одному ядру, якщо я маю, наприклад, 8 ядер і відповідно 8 ниток, де кожне з них працює на "трудомістким"завдання?
Або навпаки: чи можна призначити нитки ядрам (особливо в Java
)?
Відповіді:
2 для відповіді № 1Афаїк: Оптимальна кількість потоків для даних, придатних для паралельної обробки, - це кількість ядер, оскільки кожна теорія має (теоретично) своє власне ядро. Для центральних процесорів, які здатні до гіперструзії, це 2 рази кількість ядер. Будь ласка, виправте мене, якщо я помиляюся.
Це набагато складніше, ніж це.
Це залежить від того, для чого ви оптимізуєте. Якщо ви оптимізуєте для ефективного (тобто економічно вигідного) використання наявного обладнання, то це рідко є оптимальним. Якщо будь-яку з ниток потрібно чекати значного періоду з будь-якої причини, то виділення потоків один на одинфізичні сердечники призводять до недостатнього використання ядер. Якщо ці ядра можна було б використовувати для чогось іншого (наприклад, запустити хтось інший програми!), То ваше використання буде неоптимальним.
Навіть якщо ви оптимізуєте виключно швидкість застосування, розподіл один на один не обов'язково є найкращою стратегією.
Кожна програма + робоче навантаження має "солодке місце" втерміни кількості ниток. Це залежить від кількості та характеру будь-якої внутрішньої суперечки та кількості та характеру спілкування із зовнішніми системами (файлові системи, мережеві зв’язки тощо).
Якщо у вас є жорстке правило "одна нитка на одне ядро", то ви можете мати не більше N потоків у N основній системі.
Якщо це N значно менше кількості ниток "солодкої плями", ви можете виявити, що сердечники простоюють багато часу.
Тепер для гіпер-ниток.
Hyperthreads потенційно дасть вам додатковий процесорциклів на тактовий цикл. Однак вони не дають вам додаткових циклів у системі пам’яті. Характеристики продуктивності «віртуального ядра» гіперточок будуть відрізнятися від фізичного ядра ... а для реальних програм різниця буде значною. Отже, ваші 2 x припущення без підстави.
Моє питання, чи лежить в основі ОС (Linux,Winodws OSX) автоматично реалізує мій "намір" і, напр. присвоює кожну нитку одному ядру, якщо я маю, наприклад, 8 ядер і відповідно 8 ниток, де кожне з них працює над "трудомістким" завданням?
Не обов'язково.
ОС має враховувати і інші речівідбуваються в системі. Інші програми, демони тощо, які обробляють ваш робочий стіл, речі, які стосуються файлових систем та мережевих протоколів.
ОС (і JVM), як правило, реагують лише нащо вже відбулося при прийнятті планових рішень. Прогнозування майбутньої поведінки на основі попередньої поведінки (на цьому рівні) не є рентабельним ... а сучасні ОС не намагаються це робити, за винятком дуже грубого / евристичного рівня. Ідеальне (оптимальне) прогнозування неможливо, і навіть якщо ви володіти ідеальними знаннями. Проблема планування не є важкою.
Теоретично програміст програми може розроблятиоптимальний графік. На практиці більшість програм занадто складні для цього І важко врахувати інші "випадкові" речі, що відбуваються в системі.
Або навпаки: чи можна призначити потоки ядрам (особливо в Java)?
Для цього немає практичного способу. (Див. Відповідь @ ksmonkey123) Звичайно, не портативно.
І це, мабуть, навряд чи буде працювати на Javaтак чи інакше. У Java є проблема з додаванням того, що за задньою частиною програми є приховані потоки (наприклад, нитки збирача сміття та фіналізатора), а управління пам'яттю Java важче передбачити та важче налаштувати.
2 для відповіді № 2
Ні, ви не можете призначити потік певному ядру в Java
(Java багатопотоковість - призначте потоки ядрам процесора)
Як правило, ви можете очікувати, що операційна система більш-менш оптимально керуватиме роботою потоків. Сюди входить напр. запобігання голоду.