Я использую фразы Parallel Processing
& Multi Threading
попеременно, потому что я чувствую, что нет никакого различия между ними. Если я неправ, исправьте меня.
Я не про в Параллельной обработке. Я знаком с и использовал потоки.NET и Потоки POSIX. Не что иное как это.
Я просто просматривал архивы ТАК на многопоточности и удивленный видеть, что существует столько библиотек для Много Поточной обработки.
http://en.wikipedia.org/wiki/Template:Parallel_computing перечисляет вниз API известных (я не уверен, существуют ли какие-либо другие), Библиотеки Многопоточности.
- Потоки POSIX
- OpenMP
- PVM
- MPI
- UPC
- Intel Threading Building Blocks
- Повышение. Поток
- Глобальные массивы
- Очарование ++
- Cilk
- Co-массив Фортран
- CUDA
Кроме того, я удивлен видеть, что http://en.wikipedia.org/wiki/Comparison_of_Parallel_Computing_Libraries_ (API) отсутствует.
До настоящего времени я никогда не был ситуацией, где я должен выбрать между этими библиотеками. Но, Если я сталкиваюсь с одной такой ситуацией.
Оставляя в стороне тот факт, что это может быть сделано , межпроцессная связь никогда не осуществляется путем совместного использования ресурсов, не говоря уже о памяти мест . Это правильный рецепт катастрофы.
Правильный IPC осуществляется с помощью соответствующих средств связи, таких как разъемы. Совместное использование памяти никогда не является способом.
-121--3787320-Вам нужно регулярно сбрасывать список запросов, которые Джанго хранит в целях отладки. Обычно он очищается после каждого запроса, но так как ваше приложение не основано на запросе, вы должны сделать это вручную:
from django import db
db.reset_queries()
См. также:
«Отладка утечки памяти Джанго с помощью TrackRefs и Guppy» Микко Охтамаа:
Джанго следит за всеми запросами цели отладки (connection.queries). Этот список сбрасывается в конце HTTP-запроса. Но в автономном режиме нет запросы. Так что нужно вручную сброс в список запросов после каждого рабочий цикл
«Почему Джанго утекает память?» в Django FAQ - он рассказывает оба
об установке DEBUG
в значение False
, что всегда важно, и
об очистке списка запросов с помощью db.reset _ queries ()
,
важна в таких приложениях, как ваша.
[1] Правильный выбор параллельной библиотеки зависит от типа целевой параллельной машины : (1) машины общей памяти (т.е. многоядерной) и (2) машины распределенной памяти (т.е. Cell, Grid computing, CUDA). Также необходимо определить, какую модель параллельного программирования требуется использовать : (1) многопоточные приложения общего назначения, (2) параллелизм на уровне петель, (3) расширенный параллелизм, например конвейер, (4) параллелизм на уровне данных.
Во-первых, модель общей памяти представляет собой просто многопоточное программирование в качестве адресного пространства для всех вычислительных ядер (например, многопроцессорных микросхем и симметричных многопроцессорных процессоров). Нет необходимости явно обмениваться данными между потоками и процессами. OpenMP, Cilk, TBB все для этого домена.
Модель распределенной памяти использовалась в качестве основной модели параллельного программирования для суперкомпьютеров, где каждая отдельная машина (т.е. адресное пространство не является общим) подключена через плотную сеть. MPI - самая известная для него модель программирования. Однако эта модель все еще существует, особенно для CUDA и Cell-программирования, где адресное пространство памяти не является общим. Например, CUDA разделяет память ЦП и память графического процессора. Необходимо явно передать данные между памятью ЦП и памятью графического процессора.
Далее необходимо рассмотреть модель параллельного программирования . Потоки POSIX предназначены для многопоточного программирования общего назначения (например, высокоопоточных веб-серверов). Однако OpenMP очень специализирован для параллелизма на уровне цикла, чем общий API потока POSIX/Win32. Это упрощает резьбовую вилку и соединение. Intel TBB поддерживает параллелизм на уровне задач, включая петли и конвейеры. Существует еще один параллелизм, который можно использовать: data -параллелизм уровня. Для этой проблемы GPGU лучше, чем CPU, поскольку GPGPU специализируется на параллельных рабочих нагрузках данных. Существует также модель программирования, называемая потоковой обработкой.
[2] Я уже ответил выше.
[3] Просто. Существует множество различных моделей параллельного/параллельного программирования и различных параллельных машин. Итак, это не одна проблема; В параллельном/параллельном программировании существует так много вспомогательных проблем, которые не могут быть решены суперединой моделью программирования.
[4] Это зависит. Серьезно.
Вы можете использовать присущий вашему процессу параллелизм, организовав работу в потоки. Однако то, действительно ли работа будет выполняться параллельно, зависит от базового оборудования (один или несколько процессоров, движков или ядер).
Существуют также потоковые модели, которые привязываются к системной задаче или потоку, и другие, в которых потоки совместно используют базовые задачи. В многопроцессорной системе основные задачи могут выполняться параллельно.
Если вы правильно абстрагируете код и он может использовать преимущества потоков, он будет нормально работать на одном или нескольких процессорах, используя несколько механизмов, когда / если они доступны.
.NET 4.0 будет иметь некоторую параллельную поддержку сборки: http://code.msdn.microsoft.com/ParExtSamples
Многопоточность - это способ достижения "параллельной обработки" на подходящем компьютере (несколько процессоров/ядер) и современной операционной системе. Но "параллельная обработка" также может быть осуществлена на кластере машин "без общего доступа", которые обмениваются данными через какую-либо сеть (ethernet для копеек и myrinet или dolphin для богатых исследовательских групп/компаний) - где каждый компьютер может иметь один процессор и запускать один пользовательский поток большую часть времени.
Правильный выбор зависит от целевой архитектуры.
MPI и PVM - это интерфейсы передачи сообщений, которые обычно используются для координации работы между узлами в системах кластерного типа (то есть нескольких независимых вычислительных узлов с сетевыми соединениями). Потоки во многих их формах используются для распределения работы между несколькими ядрами или процессорами в рамках одного образа системы (то есть с общей памятью).
Также обратите внимание, что варианты выбора не обязательно являются взаимоисключающими. В аспирантуре я написал программу, которая использовала MPI для связи между узлами суперкомпьютера и использовал потоки pthread, чтобы воспользоваться преимуществами SMP на каждом узле. Это не редкость в научных вычислениях.
mpi - это передача сообщений, а не многопоточный интерфейс
pvm заменяется mpi для большинства целей
cilk не работает для большинства целей
UPC, Co-array Fortran, глобальные массивы не являются многопоточными библиотеками , они предназначены для работы с распределенной памятью
cuda для устройств, сильно отличающихся от обычных процессоров.
OpenMP может быть ограничивающим, если вы работаете вне вычислительной алгебры / приложений.
Потоки POSIX де-факто являются стандартом для UNIX, я не уверен насчет Windows
boost.thread - это универсальная объектно-ориентированная оболочка для базовых библиотек
не широко используется за пределами вычислительной химии / биологии
Блоки Intel имеют множество функций, но это сложная библиотека для использования
Я думаю, что поток ускорения - это хорошая золотая середина. окончательный выбор зависит от того, что вы пытаетесь сделать.