Итак, нужно понимать, что MPI и OpenCL для ваших целей полностью ортогональны. MPI для связи между вашими узлами GPU; OpenCL предназначен для ускорения локальных вычислений на одном узле с помощью графического процессора (или нескольких ядер процессора). Для любой из этих проблем вы должны начать с написания последовательной версии кода на C ++. Следующим шагом будет (в любом порядке) работать над реализацией OpenCL для одного узла и работать над версией MPI, которая разбирает проблемы (вы не хотите использовать master-slave для любого пользователя из перечисленных выше проблем) на несколько процессов, причем каждый процесс выполняет свою локальную часть вычислений, что способствует глобальному решению. Как только обе эти части будут выполнены, вы решите эту проблему, и у вас будет версия кода с распределенной памятью (часть MPI) (часть OpenCL) для решения этой проблемы.
Конечно, это будет не так просто, и объединение этих двух факторов потребует немалой работы, но об этом следует помнить. Начните с одной проблемы, заставьте его работать на одном процессоре в C ++, затем попробуйте его с одним или другим. Не пытайтесь делать все сразу, иначе вы никуда не денетесь.
Для таких проблем, как умножение матриц, есть много примеров в Интернете реализаций как GPU, так и MPI.