Параллельное программирование это не ускорение пошаговой программы. Это полная запись алгоритма начиная с блок-схемы, в которой есть части для пошагового выполнения, и есть те части, которые независимы друг от друга, и вполне могут производится параллельно.
Классическим примером может служить сортировка элементов.
Есть очень много разновидностей данных алгоритмов, но некоторые из них не поддаются улучшению применением параллелизма. Например, алгоритм "пузырёк" нельзя усовершенствовать применяя параллелизм, так как каждый шаг (смена положений элементов) зависит от результата предыдущего шага. Есть хороший алгоритм, который можно усовершенствовать, применяя параллелизм, это быстрая сортировка (quick sort).
Выбирается произвольный элемент, желательно средний по величине. Все элементы вектора разделяют на две части: меньшие выбранного элемента и большие. Две получившиеся части можно сортировать независимо и следовательно параллельно. Применяя параллелизм можно достичь максимальное ускорение от всех процессоров системы. И скорость выполнения будет пропорционально количеству процессоров.
('vector defmethod sortq (ind last) (nil if (nil = ind) (nil setq ind 0 last ((this size) - 1))) (nil cond (((last - ind) > 1) (nil let ((med ((ind + last) floor 2))) ; choose medium (nil if ((this elt ind) > (this elt med)) (this swap ind med)) (nil when ((this elt med) > (this elt last)) (this swap med last) (nil if ((this elt ind) > (this elt med)) (this swap ind med))) ; decompose (nil let ((ind ((ind copy) += 1)) (last ((last copy) -= 1))) (nil while (last > ind) (nil parallel (nil while ((this elt ind) < (this elt med)) (ind += 1)) (nil while ((this elt last) > (this elt med)) (last -= 1))) (nil cond ((med = last) (nil when (ind < med) (this swap ind med) (med setf ind) (last -= 1))) ((med = ind) (nil when (med < last) (this swap med last) (med setf last) (ind += 1))) (true (this swap ind last) (ind += 1) (last -= 1))))) ; parallel sorting (nil parallel (this sortq ind (med - 1)) (this sortq (med + 1) last)))) (((last - ind) = 1) (nil if ((this elt ind) > (this elt last)) (this swap ind last)))) this)
Количество процессоров можно узнать с помощью системной функции nprocs.
>(nil nprocs) 2
Есть ещё задачи, которые должны выполнятся параллельно и независимо от других задач. В операционных системах это называется драйвер. Вилка это запуск функции (nil progn {task}), не ожидая результата.
(nil fork {task})
Использование таких функций требует навыки для работы с замками.