OpenMP学习笔记1

OpenMP学习笔记1


介绍

在C/C++中,OpenMP可以通过使用预处理指令来让程序并行化。OpenMP指令使用的格式为:

 #pragma omp 指令 [子句[子句]…]

fork/join并行执行模式的概念

OpenMP是一套用于共享内存并行系统的多处理器程序设计的指导性的编译处理方案,OpenMP并行执行的程序要全部结束后才会运行后面非并行部分的代码,这就是fork/join并行模式。

例子:

#include <stdio.h>
#include <omp.h>

int main(int argc, char* argv[])
{
    int i;
	#pragma omp parallel for
	for (i = 0; i < 10; i++) {
		printf("i = %d\n", i);
	}
	printf("hello!\n");
	return 0;
}

Linux下编译方式:

gcc -fopenmp test.c -o test

结果为:

i = 8
i = 4
i = 7
i = 6
i = 5
i = 2
i = 9
i = 3
i = 0
i = 1
hello!

OpenMP指令的用法

  1. parallel指令
    parallel 是构造并行块的一个指令,同时也可以配合其他指令如for, sections等指令一起使用。在这个指令后面需要使用一对大括号来指定需要并行计算的代码。
#pragma omp parallel [for | sections] [子句[子句]…] 
{ 
//并行部分 
}
  1. for指令
    for指令的作用是使一个for循环在多个线程中执行,一般for指令会与parallel指令同时使用,即parallel for指令。此外还可以在parallel指令的并行块中单独使用,在一个并行块中可以使用多个for指令。但是单独使用for指令是没有效果的。

例子:

#include <stdio.h>
#include <omp.h>

int main(int argc, char* argv[])
{
	#pragma omp parallel 
	{
	    int i, j;
		#pragma omp for
		for (i = 0; i < 5; i++)
			printf("i = %d,threadid = %d\n", i,omp_get_thread_num());
		
		#pragma omp for
		for (j = 0; j < 5; j++)
			printf("j = %d,threadid = %d\n", j,omp_get_thread_num());
	}
	return 0;
}

结果:

i = 0,threadid = 0
i = 1,threadid = 1
i = 4,threadid = 4
i = 3,threadid = 3
i = 2,threadid = 2
j = 2,threadid = 2
j = 0,threadid = 0
j = 1,threadid = 1
j = 4,threadid = 4
j = 3,threadid = 3
  1. sections和section指令
    sections语句可以将下面的代码分成不同的分块,通过section指令来指定分块。每一个分块都会并行执行,具体格式:
#pragma omp [parallel] sections [子句]
{

	#pragma omp section
	{
	//代码
	}}

例子:

#include <stdio.h>
#include <omp.h>

int main(int argc, char* argv[])
{
	
	#pragma omp parallel sections
	{
		#pragma omp section 
		printf("Section 1 ThreadId = %d\n", omp_get_thread_num());
		#pragma omp section
		printf("Section 2 ThreadId = %d\n", omp_get_thread_num());
		#pragma omp section
		printf("Section 3 ThreadId = %d\n", omp_get_thread_num());
		#pragma omp section
		printf("Section 4 ThreadId = %d\n", omp_get_thread_num());
	}
	return 0;
}

结果:

Section 3 ThreadId = 18
Section 2 ThreadId = 15
Section 1 ThreadId = 27
Section 4 ThreadId = 23

参考:

link

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值