[1] Правильный выбор параллельной библиотеки зависит от типа целевой параллельной машины : (1) машина с общей памятью (т.е. многоядерные) и (2) машина с распределенной памятью (то есть Cell) , Grid-вычисления, CUDA). Вам также необходимо подумать, какую модель параллельного программирования вы хотите: (1) универсальные многопоточные приложения, (2) параллелизм на уровне цикла, (3) расширенный параллелизм, такой как конвейер, (4) данные параллелизм.
Во-первых, модель разделяемой памяти - это просто многопоточное программирование, поскольку адресное пространство по всем вычислительным ядрам (например, многопроцессорным чипам и симметричным многопроцессорным процессам) совместно используется. Нет необходимости явно обмениваться данными между потоками и процессами. OpenMP, Cilk, TBB - все для этого домена.
Модель распределенной памяти раньше была моделью основного параллельного программирования для суперкомпьютеров, где каждая отдельная машина (т. Е. Адресное пространство не используется совместно) подключена через ограниченную сеть. MPI - самая известная модель программирования для него. Однако эта модель все еще существует, особенно для программирования на основе CUDA и Cell, где адресное пространство памяти не используется совместно. Например, CUDA разделяет память CPU и память GPU. Вам явно необходимо передавать данные между памятью процессора и памятью графического процессора.
Далее необходимо рассмотреть модель параллельного программирования . Потоки POSIX предназначены для многопоточного программирования общего назначения (например, многопоточных веб-серверов). Тем не менее, OpenMP очень специализирован для параллелизма на уровне цикла, чем обычный API потока POSIX / Win32. Это упрощает нить форк и соединение. Intel TBB поддерживает различный параллелизм на уровне задач, включая циклы и конвейеры. Существует еще один параллелизм, который вы можете использовать: параллелизм на уровне данных. Для этой проблемы GPGU будет лучше, чем CPU, поскольку GPGPU специализируется для параллельных рабочих нагрузок. Есть также модель программирования, называемая потоковой обработкой.
[2] Я уже ответил выше.
[3] Просто. Существует много разных параллельных / параллельных моделей программирования и разных параллельных машин. Итак, это не единственная проблема; В параллельном / параллельном программировании так много подзадач, которые на данный момент не могут быть решены с помощью супер-единой модели программирования.
[4] Это зависит. Серьезно.