Основа

  Параллельное программирование это не ускорение пошаговой программы. Это полная запись алгоритма начиная с блок-схемы, в которой есть части для пошагового выполнения, и есть те части, которые независимы друг от друга, и вполне могут производится параллельно.
  Классическим примером может служить сортировка элементов.

Сортировка

  Есть очень много разновидностей данных алгоритмов, но некоторые из них не поддаются улучшению применением параллелизма. Например, алгоритм "пузырёк" нельзя усовершенствовать применяя параллелизм, так как каждый шаг (смена положений элементов) зависит от результата предыдущего шага. Есть хороший алгоритм, который можно усовершенствовать, применяя параллелизм, это быстрая сортировка (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})

  Использование таких функций требует навыки для работы с замками.