| Re[6]: Fork/Join | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | remark | http://groups.google.com/group/lock-free |
| Дата: | 28.12.07 09:15 | |
| Оценка: | 44 (3) | |
| Здравствуйте, Sergey, Вы писали: S>>>На Join-исчисление я где-то натыкался (разглядывая boost::join, кажется), но, честно говоря, практического смысла в нем не увидел. Смотрел правда невнимательно, может оно и вправду полезное... D>>Можете посмотреть тут — www.mcsharp.net или здесь. Повторюсь, что Join-исчисление прежде всего интересно как концепция для построения языков программирования. S>Ну на плюсах насколько я понял Join-исчисление при желании реализуется как библиотека. Осталось понять, что оно дает... 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) Автор: remark Дата: 06.12.07 Качать здесь: 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. Надеюсь вопросов, что такое Fork/Join больше не осталось Всё о параллелизме. На русском. |