За паралелен алгоритъм с N нишки може ли увеличението на производителността да бъде повече от N?

Теоретичен въпрос, може би е очевиден:

Възможно ли е алгоритъм, след като бъде внедрен по паралелен начин с N нишки, да бъде изпълнен повече от N пъти по-бързо от оригиналния, еднонишков алгоритъм? С други думи, може ли печалбата да бъде по-добра от линейната с брой нишки?


person Jakub M.    schedule 25.10.2011    source източник


Отговори (3)


Не е често срещано, но със сигурност е възможно.

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

В случай като този серийното изчисление на един процесор обикновено ще бъде ограничено основно от честотната лента към основната памет. Ако приемем, че имате (поне) толкова процесори/ядра (всеки със собствен кеш за данни), колкото стъпките на тръбопровода, можете да заредите всеки кеш за данни веднъж и да обработвате един пакет данни след друг, запазвайки едни и същи статични данни за всички тях. Сега вашето изчисление може да продължи със скоростта на процесора, вместо да бъде ограничено от честотната лента към основната памет, така че подобрението на скоростта може лесно да бъде 10 пъти по-голямо от броя на нишките.

Теоретично бихте могли да постигнете същото с един процесор, който просто имаше наистина огромен кеш. От практическа гледна точка обаче изборът на процесори и размери на кеша е доста ограничен, така че ако искате да използвате повече кеш, трябва да използвате повече процесори -- и начина, по който повечето системи предлагат, за да постигнете това е с множество нишки.

person Jerry Coffin    schedule 25.10.2011
comment
Виждате това също понякога, когато отивате към множество възли и сега имате множество честотни ленти на паметта / мрежови канали / входно/изходни канали за достъп -- ако съперничеството за тях е било първоначалното тясно място, можете за кратко да видите свръхлинейни ускорявания точно поради причината, описана от Джери по-горе. - person Jonathan Dursi; 25.10.2011

да

Видях алгоритъм за преместване на ръка на робот чрез сложни маневри, който основно се разделя на N нишки и всяка нишка се движи повече или по-малко произволно през пространството на решението. (Това не беше практичен алгоритъм.) Статистиката ясно показа суперлинейно ускоряване на една нишка. Очевидно вероятността за постигане на решение с течение на времето е нараснала сравнително бързо и след това е изравнена до известна степен, така че предимството беше в многото първоначални опити.

person David Thornley    schedule 25.10.2011
comment
Интересен момент! Съвременните SAT решаващи често използват агресивни стратегии за рестартиране точно поради тази причина. - person hugomg; 25.10.2011
comment
@missingno: звучи интересно, можеш ли да дадеш някои препратки? - person Jakub M.; 25.10.2011
comment
Основната идея е, че за NP пълни проблеми разпределението дължина за решаване е силно изкривено към експоненциален най-лош случай (срещу много лесния най-добър сценарий). Въпреки това не мога да се сетя за други добри препратки, които да излязат от главата ми, освен напълно прекомерния sat наръчник (вижте страничната лента). SAT е дълбок човек... Както и да е, няма да навреди да споменем Minisat. - person hugomg; 25.10.2011
comment
Това обаче не изисква множество нишки. Можете да приложите това, като използвате една нишка и нещо, което прилича на превключване на контекста. Тоест, изчислете част от едно изчисление, след това част от второ и т.н. - person svick; 25.10.2011
comment
@svick: поздравления, току-що преоткрихте нишките в потребителски режим. - person Jerry Coffin; 25.10.2011
comment
@JerryCoffin, въпросът е, че тези „нишки“ ще работят на една действителна нишка и така ще използват само едно процесорно ядро. Това означава, че ускоряването се дължи на използването на различен алгоритъм, а не на наличието на повече ядра. (Всъщност не бих го приложил по този начин, освен ако няма добра причина да го направя.) - person svick; 25.10.2011
comment
@svick: Не; оригиналният алгоритъм правеше полуслучайна разходка през фазовото пространство. Правенето на няколко наведнъж би означавало промяна на алгоритъма. Освен това, когато се правят нишки на потребителско ниво, има превключване на контекста и това може да забави нещата, правейки многонишковото внедряване суперлинейно. - person David Thornley; 29.10.2011

Законът на Амдал (паралелизиране) ни казва, че това не е възможно за общия случай. В най-добрия случай можем идеално да разделим работата по N. Причината за това е, че без серийна част, формулата на Amdahl за ускоряване става:

Ускоряване = 1/(1/N)

където N е броят на процесорите. Това разбира се намалява само до N.

person Michael Goldshteyn    schedule 25.10.2011
comment
Въпреки че законът на Амдал не взема предвид някои практически подробности, например цената на превключването на контекста. - person ruslik; 25.10.2011
comment
@dacc: да, ако паралелизирате сериен алгоритъм, не, ако сериализирате паралелен. - person ruslik; 25.10.2011
comment
Законът на Амдал е много полезно правило, но не е пълна теория за паралелни изчисления. Както в отговора на @Jerry Coffin, ефектите на кеша (или, аналогично, ефектите на честотната лента на паметта, използвани при използване на множество възли) понякога могат да дадат суперлинейни ускорения на малък брой процесори. - person Jonathan Dursi; 25.10.2011