OpenMP实例【Helloworld】代码解析

版权声明:本文为博主原创文章,未经博主允许不得转载。 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得到当前线程的index
  • omp_get_num_threads得到总共的线程数目

OpenMP 采用的是 master-slaves的机制。后面的片段(structured block),其实是所有线程(包括master)都会执行对应的代码。

采用的是join的模式,所以,会有一个隐形路障的概念,其实很简单,就是等其他线程结束,才回到之前的状态,然后master再接着去完成。

然后每个线程都是采用竞争访问,所以输出的顺序不一定会统一。

猜你喜欢

转载自blog.csdn.net/a19990412/article/details/85148200