Fork/Join сейчас является одной из самых распространённых
методик для построения параллельных алгоритмов. Так же его называют
параллельным Divide&Conquer (разделяй и властвуй). Идея следующая. Большая задача разделяется на несколько меньших. Потом эти ещё деляться на меньшие. И так до тех пор, пока задача не становится тривиальной, тогда она решается последовательным методом. Этот этап называется Fork. Далее [опционально] идёт процесс "свёртки", когда решения маленьких задач объединяются некоторым образом пока не получится решение самой верхней задачи. Этот этап называется Join. Решения всех подзадач (в т.ч. и разбиений на меньшие задачи) происходит параллельно. В принципе для решения некоторых задач этап Join не требуется. Например, для параллельного QuickSort — тут мы просто рекурсивно делим массив на всё меньшие и меньшие диапазоны, пока не дойдём до тривиального случая из 1 элемента. Хотя в некотором смысле Join нужен и тут, т.к. нам всё равно надо дождаться пока не закончится обработка всех подзадач. Что поглядеть. Не буду ходить очень далеко в прошлое или вдаваться в теорию. CilkРасширение для языка С. Реализовано в виде препроцессора и небольшого ран-тайм. Появилось в первой половине 90-х, активно развивалось до 2000, сейчас находится в стабильной версии. Одна из самых эффективных библиотек для параллельного программирования.Самый любимый алгоритм, который реализовывают и на котором меряются пиписьками, создатели параллельных систем — рассчёт N-ого числа Фибоначи методом грубой силы. Вот пример на Cilk:
Собственно Fork/Join схема — это единственная схема, возможная в Cilk. Т.е. авторы сделали ставку исключительно на эту модель. Подроднее здесь: The Cilk Project Cilk Papers Cilk 5.4.6 Reference Manual Качать здесь: http://supertech.csail.mit.edu/cilk/cilk-5.4.6.tar.gz Сейчас на основе Cilk разработан JCilk (соотв. для Java) и Cilk++ (для С++). JCilk Java Fork/Join FrameworkРазработана Doug Lea (который сделал dlmalloc). АФАИК Является пропоузалом для включения в спецификацию Ява (возможно уже включён — не слежу). Единственный вид параллелизма — тоже только Fork/Join.Подроднее здесь: Java Fork/Join Framework Качать здесь: http://gee.cs.oswego.edu/dl/classes/EDU/oswego/cs/dl/current/concurrent.tar.gz http://gee.cs.oswego.edu/dl/classes/EDU/oswego/cs/dl/current/concurrent.zip Пример Фибоначи:
Task Parallel Library (Parallel Extensions to .NET)Это соотв. параллельные расширения для .NET. Тут уже возможена не только Fork/Join схема, но параллельность по данным и общая параллельность по задачам.Подроднее здесь: Optimize Managed Code For Multi-Core Machines [ANN] Task Parallel Library (Parallel Extensions to .NET) Качать здесь:
http://www.microsoft.com/downloads/details.aspx?FamilyID=e848dc1d-5be3-4941-8705-024bc7f180ba&displaylang=enК сожалению примера Фибаначи не прилагается, но выглядел бы он примерно так же. Вот коротенький пример:
Intel Threading Building BlocksОпять библиотека для С++. Опен сорц. Так же как и Task Parallel Library помимо Fork/Join так же предоставляет параллельность по данным и общая параллельность по задачам.Подроднее здесь: TBB Home TBB Overview TBB Code Samples Качать здесь: http://threadingbuildingblocks.org/file.php?fid=77 Вот пример суммирования значений в дереве с помощью Fork/Join:
Несмотря на то, что Task Parallel Library и Intel Threading Building Blocks предоставляют так же возможность создания алгоритмов с параллелизмом по данным и с общим параллелизмом по задачам, фактически это просто надстройки над Fork/Join. Параллелизм по данным реализуется как одноразовый неявный Fork нескольких подзадач и потом неявный Join. Параллельность по задачам — это просто Fork без Join. |