Распараллеливание: pthreads или OpenMP?

Вы можете использовать пользовательский formats.py (см. « Создание файлов пользовательского формата » в документации Django) и определить THOUSAND_SEPARATOR и DECIMAL_SEPARATOR

THOUSAND_SEPARATOR = ''
DECIMAL_SEPARATOR = '.'

Это глобальный параметр, поэтому он будет влиять на все поплавки, отображаемые на вашем сайте. И вам придется включить локализацию (USE_L10N в вашем settings.py).

Если у вас есть контроль над шаблоном, вы можете просто удалить фильтр floatformat.

edit : Я не уверен, но, возможно, вы стали жертвой этой ошибки Django: # 13617 . Попробуйте отключить поддержку локализации в файле settings.py и посмотрите, исчезают ли ошибочные запятые:

USE_L10N = False

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

44
задан hanno 1 June 2009 в 15:59
поделиться

3 ответа

В основном все сводится к тому, какой уровень контроля над распараллеливанием вы хотите. OpenMP отлично подходит, если все, что вам нужно, - это добавить несколько операторов #pragma и довольно быстро получить параллельную версию вашего кода. Если вы хотите делать действительно интересные вещи с помощью кодирования MIMD или сложной организации очередей, вы все равно можете делать все это с помощью OpenMP, но, вероятно, в этом случае намного проще использовать потоки. OpenMP также имеет аналогичные преимущества в переносимости, поскольку многие компиляторы для разных платформ теперь поддерживают его, как и pthreads.

Итак, вы абсолютно правы - если вам нужен точный контроль над распараллеливанием, используйте pthreads. Если вы хотите распараллеливать с минимальными затратами времени, используйте OpenMP.

Каким бы путем вы ни решили пойти, удачи!

41
ответ дан 26 November 2019 в 22:08
поделиться

Еще одна причина: OpenMP основан на задачах, Pthreads основан на потоках. Это означает, что OpenMP будет выделять столько же потоков, сколько и количество ядер. Таким образом вы получите масштабируемое решение. Сделать это с использованием сырых потоков не так-то просто.

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

Просто подумайте о своих требованиях и попытайтесь понять: достаточно ли OpenMP для вас? Вы сэкономите много времени.

23
ответ дан 26 November 2019 в 22:08
поделиться

OpenMP требует компилятора, который его поддерживает и работает с прагмами. Преимущество заключается в том, что при компиляции без поддержки OpenMP (например, PCC или Clang/LLVM на данный момент), код все равно будет скомпилирован. Также, взгляните на то, что Чарльз Лейзерсон написал о многопоточности DIY.

Pthreads - это стандарт POSIX (IEEE POSIX 1003.1c) для библиотек, в то время как Спецификации OpenMP должны быть реализованы на компиляторах; при этом существует множество реализаций pthread (e. например, rthreads OpenBSD, NPTL), и ряд компиляторов, поддерживающих OpenMP (например, GCC с флагом -fopenmp, MSVC++ 2008).

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

.
8
ответ дан 26 November 2019 в 22:08
поделиться
Другие вопросы по тегам:

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