版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a19990412/article/details/85148200
简述
内容基本上来源于课本,我结合自己的理解组织下。
用的是下面的代码
代码
#include <iostream>
#include <omp.h>
using namespace std;
#pragma warning(disable : 4996)
void Hello();
int main(int argc, char **argv) {
if (argc < 2) return 0;
int thread_count = strtol(argv[1], NULL, 10);
#pragma omp parallel num_threads (thread_count)
Hello();
}
void Hello() {
int my_rank = omp_get_thread_num();
int thread_count = omp_get_num_threads();
char data[50];
sprintf(data, "Hello from thread %d of %d\n", my_rank, thread_count);
cout << data;
}
代码解释
strtol(argv[1], NULL, 10);
- 意思是将这个字符串通过10进制转成长整数
#pragma omp parallel num_threads (thread_count)
- OpenMP中使用的是
#pragma omp
- 然后pragma后面的第一条指令是
parallel
,表示之后的结构代码块(sturctured block)应该被多线程并行执行。这里的并行方式是fork之后再join的方式 - 之后有parallel 的子指令
num_threads (thread_count)
用于指定运行的线程数目。
int my_rank = omp_get_thread_num();
int thread_count = omp_get_num_threads();
omp_get_thread_num
得到当前线程的indexomp_get_num_threads
得到总共的线程数目
OpenMP 采用的是 master-slaves的机制。后面的片段(structured block),其实是所有线程(包括master)都会执行对应的代码。
采用的是join的模式,所以,会有一个隐形路障的概念,其实很简单,就是等其他线程结束,才回到之前的状态,然后master再接着去完成。
然后每个线程都是采用竞争访问,所以输出的顺序不一定会统一。