Передача Последовательных Процессов когда-либо используется в больших многопоточных программах C++?

Я в настоящее время пишу большую многопоточную программу C++ (> 50K LOC).

Как таковой я был мотивирован для чтения много на различных методах для обработки многопоточного кода. Одна теория, которую я нашел, чтобы быть довольно прохладным:

http://en.wikipedia.org/wiki/Communicating_sequential_processes

И это изобретено немного известным парнем, который сделал другие нетривиальные вклады в параллельное программирование.

Однако CSP используется на практике? Кто-либо может указать на какое-либо крупное приложение, записанное в стиле CSP?

Спасибо!

10
задан guido 27 April 2013 в 02:37
поделиться

6 ответов

CSP, как вычисление процессов, по сути является теоретической вещью, которая позволяет нам формализовать и изучить некоторые аспекты параллельной программы.

Если вместо этого вам нужна теория, которая позволит вам строить распределенные программы, то вам следует обратить внимание на параллельное структурированное программирование .

Параллельное структурное программирование является основой текущих исследований HPC (высокопроизводительных вычислений) и предоставляет вам методологию подхода и разработки параллельных программ (по сути, блок-схем взаимодействия вычислительных узлов) и систем времени выполнения для их реализации.

Центральной идеей в параллельном структурированном программировании является идея алгоритмического скелета , первоначально разработанная Мюрреем Коулом. Каркас - это нечто вроде параллельного шаблона проектирования со связанной моделью затрат и (обычно) системой времени выполнения, которая его поддерживает. Скелетные модели , исследования и поддерживают класс параллельных алгоритмов, имеющих определенную «форму».

В качестве примечательного примера, mapreduce (ставший популярным благодаря Google) - это просто своего рода каркас, который обращается к параллелизму данных, где вычисления могут быть описаны фазой map (применить функция f для всех элементов, составляющих входные данные), и фаза уменьшения (возьмите все преобразованные элементы и «объедините» их с помощью ассоциативного оператора +).

Я нашел идею параллельного структурированного программирования как теоретически обоснованной, так и практической полезной, поэтому я предлагаю взглянуть на нее.

Несколько слов о многопоточности: поскольку скелеты решают проблему массового параллелизма, обычно они реализуются в распределенной памяти, а не в общей. Intel разработала инструмент TBB , который обращается к многопоточности и (частично) следует структуре параллельного структурированного программирования. Это библиотека C ++, поэтому, вероятно, вы можете просто начать использовать ее в своих проектах.

9
ответ дан 3 December 2019 в 19:32
поделиться

Этот стиль повсеместно используется в Unix, где многие инструменты предназначены для обработки от стандартного in к стандартному out. У меня нет никаких знаний из первых рук о больших системах, которые собираются таким образом, но я видел много маленьких одноразовых систем, которые

, например, эта простая командная строка использует (как минимум) 3 процесса.

cat list-1 list-2 list-3 | sort | uniq > final.list
0
ответ дан 3 December 2019 в 19:32
поделиться

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

Программа проприетарна (к сожалению), так что я не могу показать исходный текст.

На мой взгляд, этот стиль полезен для некоторых вещей, но обычно лучше всего смешивать с некоторыми другими методами. Часто есть основная часть вашей программы, которая представляет собой узкое место в обработке, и применение различных методов увеличения параллелизма, вероятно, принесет наибольший выигрыш.

0
ответ дан 3 December 2019 в 19:32
поделиться

У Microsoft была технология под названием ActiveMovie (если я правильно помню), которая выполняла последовательную обработку аудио- и видеопотоков. Данные передаются от одного фильтра к другому для перехода от формата ввода к формату вывода (и источника / приемника). Может, это практический пример ??

0
ответ дан 3 December 2019 в 19:32
поделиться

Статья в Википедии кажется мне множеством забавных символов, используемых для обозначения пешеходных концепций. Для очень больших или расширяемых программ формализм может быть очень важен для проверки того, как (под) процессам разрешено взаимодействовать.

Для программы класса 50 000 строк вам, вероятно, лучше спроектировать ее так, как вы считаете нужным.

В целом, следование подобным идеям является хорошей идеей с точки зрения производительности. Постоянные потоки, обрабатывающие данные поэтапно, не будут конкурировать и будут хорошо использовать локальность данных. Кроме того, легко дросселировать потоки, чтобы избежать накопления данных, поскольку быстрая стадия питает медленную стадию: просто заблокируйте быструю, если ее выходной буфер становится слишком большим.

0
ответ дан 3 December 2019 в 19:32
поделиться

Здесь может быть некоторая путаница, Axes3D имеет свойства w_xaxis, w_yaxis и w_zaxis для осей вместо обычных xaxix, yaxis и т.д.

UPDATE Теперь использует функцию для форматирования меток.

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.dates as dates
import datetime, random
import matplotlib.ticker as ticker

def random_date():
      date = datetime.date(2008, 12,01)
      while 1:
        date += datetime.timedelta(days=30)
        yield (date)

def format_date(x, pos=None):
     return dates.num2date(x).strftime('%Y-%m-%d') #use FuncFormatter to format dates

r_d = random_date()
some_dates = [dates.date2num(r_d.next()) for i in range(0,20)]

fig = plt.figure()
ax = Axes3D(fig,rect=[0,0.1,1,1]) #make room for date labels

for c, z in zip(['r', 'g', 'b', 'y'], [30, 20, 10, 0]):
    xs = np.array(some_dates)
    ys = np.random.rand(20)
    ax.bar(xs, ys, zs=z, zdir='y', color=c, alpha=0.8,width=8)

ax.w_xaxis.set_major_locator(ticker.FixedLocator(some_dates)) # I want all the dates on my xaxis
ax.w_xaxis.set_major_formatter(ticker.FuncFormatter(format_date))
for tl in ax.w_xaxis.get_ticklabels(): # re-create what autofmt_xdate but with w_xaxis
       tl.set_ha('right')
       tl.set_rotation(30)     

ax.set_ylabel('Series')
ax.set_zlabel('Amount')

plt.show()

Создает:

alt text http://www.imagechicken.com/uploads/1265570252049424000.png

-121--2986128-

У меня также была та же проблема и решение, что и у Рика, за исключением того, что я импортировал существующий файл .edmx в новый проект, и хотя базовое пространство имен не имело значения, оно было импортировано в другую подкаталогу, поэтому мне также пришлось обновить последовательность соединения в Web.Config в трех местах, чтобы включить различные имена подкаталогов:

-121--1778439-

Да и нет. Основная идея CSP используется довольно мало. Например, защищенные от потоков очереди в той или иной форме часто используются в качестве основного (часто единственного) механизма связи для построения конвейера из отдельных процессов (потоков).

Хоар, будучи Хоаром, однако, в его первоначальной теории есть немного больше, чем это. Он изобрел нотацию для разговора о процессах, определил конкретный набор сигналов, которые можно посылать между процессами, и так далее. Нотация с тех пор была уточнена различными способами, довольно много работы вложено в доказательство различных аспектов и так далее.

Применение этой относительно формальной модели CSP (в отличие от просто общей идеи) встречается гораздо реже. Он был использован в нескольких системах, где высокая надежность считалась чрезвычайно важной, но мало программистов, кажется, заинтересованы в изучении (еще один) формальных обозначений дизайна.

Когда я разрабатывал подобные системы, я обычно использовал менее строгий подход, но (по крайней мере, мне) более простой для понимания: довольно простую схему с прямоугольниками, представляющими процессы, и стрелками, представляющими линии связи. Я сомневаюсь, что мог бы предложить многое в путь доказательства о большинстве конструкций (и я признаю, что я не разработал действительно огромную систему в этом пути), но он работал достаточно хорошо, тем не менее.

6
ответ дан 3 December 2019 в 19:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: