Основная вещь, которую вы должны иметь в виду, это выбор между разделяемой памятью и распределенной памятью.
Общая память - это когда у вас есть более одного процесса (обычно более одного потока внутри процесса), который может получить доступ к общей памяти. Это может быть достаточно детальным, и обычно проще адаптировать однопоточную программу к нескольким потокам. Вам нужно будет спроектировать программу таким образом, чтобы потоки работали большую часть времени в отдельных частях памяти (использование параллелизма данных) и чтобы общая часть была защищена от одновременного доступа с помощью блокировок.
Распределенная память означает, что у вас есть разные процессы, которые могут выполняться на одном или нескольких распределенных компьютерах, но вместе они имеют общую цель и обмениваются данными через передачу сообщений (обмен данными). Нет общего пространства памяти, и все данные, которые нужны одному процессу от другого процесса, потребуют обмена данными.
Это более общий подход, но из-за требований к коммуникациям он требует крупнозернистого зерна.
TBB - это библиотека для параллелизма разделяемой памяти на основе потоков, в то время как MPI - это библиотека для параллелизма распределенной памяти (она имеет простые примитивы для связи, а также сценарии для нескольких процессов при выполнении разных узлов).
Самое важное для вас - идентифицировать параллелизмы в вашем решателе, а затем выбрать лучшее решение. Есть ли у вас параллелизм данных (разные потоки / процессы могут работать параллельно в разных порциях данных без необходимости обмена или разделения частей этих данных)? Параллелизм задач (разные потоки / процессы могут выполнять разные преобразования ваших данных или разные этапы обработки данных конвейерным или графическим способом)?