/ / c ++ std :: async: по-бързо на 4 ядра в сравнение с 8 ядра - многонишково, c ++ 11, асинхронни, cpu-ядра

c ++ std :: async: по-бързо на 4 ядра в сравнение с 8 ядра - multithreading, c ++ 11, асинхронни, cpu-core

Имам 16000 работни места за изпълнение.

Всяка работа е независима. Няма споделена памет, няма комуникация между процесите, заключване или мутекс.

Аз съм на Ubuntu 16.06. C ++ 11. Процесор Intel® Core ™ i7-8550U @ 1.80GHz × 8

Използвам std :: async за разделяне на работни места между ядрата.

Ако разделим задачите на 8 (2000 на ядро), времето за изчисление е 145. Ако разделим задачите на 4 (4000 на ядро), времето за изчисление е 60.

Изход след намаляване е същото и в двата случая.

Ако наблюдавам процесора по време на изчисленията (просто използвам htop), нещата се случват според очакванията (8 ядра се използват при 100% в първия случай, само 4 ядра се използват 100% във втория случай).

Много съм объркана защо 4 ядра ще обработват много по-бързо от 8.

Отговори:

4 за отговор № 1

Най- i7-8550U има 4 ядра и 8 нишки.

Каква е разликата? Цитирайки How-To Geek:

Hyper-threading беше първият опит на Intelдонесе паралел изчисляване на потребителски компютри. Той дебютира на настолни процесори с Pentium 4 HT през 2002 година едно CPU ядро, така че наистина може да изпълнява само една задача при време - дори ако е успяла да превключи между задачите достатъчно бързо изглеждаше като многозадачност. Хипер-резбата се опита да компенсира че.

Едно физическо CPU ядро ​​с хипер-резбаизглежда като две логически Процесори за операционна система. Процесорът все още е единичен CPU, така че е a малко измама. Докато операционната система вижда два CPU за всяко ядро, действителният хардуер на процесора има само един комплект изпълнение ресурси за всяко ядро. CPU се преструва, че има повече ядра от него използва и използва своята собствена логика, за да ускори изпълнението на програмата. в С други думи, операционната система се подвежда да види за два процесора всяко действително CPU ядро.

Hyper-threading позволява двете логически CPU ядрада споделят физически ресурси за изпълнение. Това може да ускори нещата до известна степен - ако е виртуално Процесорът е спрян и чака, а другият виртуален CPU може да заема ресурси за изпълнение. Hyper-threading може да ускори системата ви, но не е толкова близо до наличието на действителни допълнителни ядра.

Чрез разделянето на работните места на повече ядра от наличните - плащате голяма санкция.