Вопрос
Существуют ли какие-либо парадигмы, которые дают вам другой образ мышления или другой подход к написанию многопоточных приложений?Возможно, что-то совершенно разное, например, процедурное программирование и функциональное программирование.
Решение
У параллелизма есть много разных моделей для разных задач.Страница в Википедии, посвященная параллелизм перечислены несколько моделей, а также есть страница для шаблоны параллелизма который имеет хорошую отправную точку для различных способов подхода к параллелизму.
Подход, который вы выберете, во многом зависит от решаемой проблемы.Различные модели решают различные проблемы, которые могут возникнуть в параллельных приложениях, и некоторые из них основаны на других.
В классе меня учили, что параллелизм использует взаимное исключение и синхронизация вместе для решения проблем параллелизма.Для некоторых решений требуется только один, но с помощью обоих вы сможете решить любую проблему параллелизма.
В качестве совершенно другой концепции вы можете рассмотреть неизменность и параллелизм.Если все данные неизменяемы, то традиционные подходы к параллелизму даже не требуются. Эта статья исследует эту тему.
Другие советы
Я не совсем понимаю вопрос, но если вы начнете писать код, используя КУДА дать вам другой взгляд на многопоточные приложения.
Он отличается от общих методов многопоточности, таких как семафоры, мониторы и т. д.потому что у вас есть тысячи потоков одновременно.Таким образом, проблема параллелизма в CUDA больше связана с разделением ваших данных и последующим смешиванием фрагментов данных.
Просто небольшой пример полного переосмысления распространенной серийной проблемы — это СКАНИРОВАНИЕ алгоритм.Это так же просто, как:
- Учитывая набор {a,b,c,d,e}
Мне нужен следующий набор:
{a, a+b, a+b+c, a+b+c+d, a+b+c+d+e}
Где символ «+» в данном случае — это любой коммутативный оператор (не только плюс, но и умножение).
Как это сделать параллельно?Это полное переосмысление проблемы, она описана в этом бумага.
Еще больше реализаций различных алгоритмов в CUDA можно найти в документации NVIDIA. Веб-сайт
Что ж, очень консервативный сдвиг парадигмы — от параллелизма, ориентированного на потоки (совместное использование всего), к параллелизму, ориентированному на процессы (разделение адресного пространства).Таким образом можно избежать непреднамеренного обмена данными и упростить соблюдение политики связи между различными подсистемами.
Эта идея старая и распространялась (среди прочих) сообществом Micro-Kernel OS для создания более надежных операционных систем.Интересно, Сингулярность Прототип ОС от Microsoft Исследования показывают, что традиционные адресные пространства даже не требуются при работе с этой моделью.
Относительно новая идея, которая мне нравится больше всего, транзакционная память:избегайте проблем с параллелизмом, гарантируя, что обновления всегда являются атомарными.
Взгляните на OpenMP за интересный вариант.