我是 OpenMP 和 MPI 的新手,我想将 OpenMP 和 MPI 导入到我现有的 CMake 项目中。所以 -
首先,我创建了一个非常简单的 MPI 项目。
主.cpp:
#include "mpi.h"
#include "iostream"
int main(int argc, char** argv){
MPI_Init(NULL, NULL);
int world_size;
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
int world_rank;
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
char processor_name[MPI_MAX_PROCESSOR_NAME];
int name_len;
MPI_Get_processor_name(processor_name, &name_len);
printf("Hello world from processor %s, rank %d out of %d processors\n",processor_name, world_rank, world_size);
MPI_Finalize();
}
Run Code Online (Sandbox Code Playgroud)
我可以使用以下命令成功编译并运行项目:
$ mpicxx main.cpp -o main.out
$ mpirun -np 2 main.out
Run Code Online (Sandbox Code Playgroud)
然后我使用 CLion 创建并配置了一个 CMake 项目。我也可以使用 CLion 成功编译和运行它,但它只使用了一个处理器。
CMakeLists.txt:
cmake_minimum_required(VERSION 3.5)
project(Test)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} …Run Code Online (Sandbox Code Playgroud) 我感到困惑omp single和omp task指令。我已经阅读了几个使用它们的例子。以下示例显示如何使用任务构造来处理链表的元素。
1 #pragma omp parallel
2 {
3 #pragma omp single
4 {
5 for(node* p = head; p; p = p->next)
6 {
7 #pragma omp task
8 process(p);
9 }
10 }
11 }
Run Code Online (Sandbox Code Playgroud)
我无法理解此示例中的并行性。使用omp single,只有一个线程会执行与单个构造相关的结构化块,对吗?在这个例子中,第 4-10 行是与单个构造相关的结构化块,它只能执行一次,那么为什么我们可以omp task在这个结构化块内部使用呢?它如何以并行方式工作?