[CA-3]openMP详细介绍

本文详细介绍了OpenMP的概念和原理,包括阿姆达尔定律、多处理系统、多线程以及Hyperthreading。通过示例展示了如何使用OpenMP进行线程创建、并行区域的设定,以及在多线程中应用锁进行同步控制,同时讨论了多线程在向量加法和点乘计算中的应用。
摘要由CSDN通过智能技术生成

阿姆达尔定律(Amdahl’s Law)

系统部分性能的提升对于系统整体的影响。这取决于该部分的提升程度与significance.
具体的计算为
在这里插入图片描述
REFERENCE:https://zhuanlan.zhihu.com/p/48022905
在这里插入图片描述

多处理系统(multiprocessor)

在这里插入图片描述
每一个处理器拥有自己的PC(program counter),并且处理互相独立的指令。他们共用一个内存
两种用途1.Deliver high throughput for independent jobs via job-level
parallelism
2.Improve the run time of a single program that has been
specially crafted to run on a multiprocessor - a parallel- processing program

Why Multicore

在这里插入图片描述

线程(thread)

Thread: a sequential flow of instructions that performs some task
每一个线程都有自己的PC和寄存器,并且共用一个内存

Hyperthreading

在这里插入图片描述

openMP

在这里插入图片描述

原理

从作为一个主线程开始,当运行到第一个平行展开区域时
Fork:主线程创造一些平行的线程
Join:当这些子线程完成指令时,他们终止,仅留下主线程
在这里插入图片描述

progma

在这里插入图片描述
在这里插入图片描述

Thread Creation

在这里插入图片描述
注意!!!openMP创建的thread是 software thread,但是在每一个thread都会分配一个hardware thread

omp_set_num_threads(x);//OpenMP intrinsic to set number of threads
num_th = omp_get_num_threads();//OpenMP intrinsic to get number of threads
th_ID = omp_get_thread_num();//OpenMP intrinsic to get Thread ID number

Hello Word

#include <stdio.h>
#include <omp.h>
int main () {
   
int nthreads, tid;
/* Fork team of threads with private var tid */
#pragma omp parallel private(tid)
{
   
tid = omp_get_thread_num(); /* get thread id */
printf("Hello World from thread = %d\n", tid);
if (tid == 0) {
   
/* Only master thread does this */
nthreads = omp_get_num_threads();
printf("Number of threads = %d\n", nthreads);
}
} /* All threads join master and terminate */
}

在这里插入图片描述

锁(lock)

对于某一些元素,我们希望多线程在执行他的时候一个一个执行,比如说求和,那么我没就会在做加法的区域加锁
在这里插入图片描述

多线程向量加法

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

#define ARRAY_SIZE 1000000
#define REPEAT     100

double* gen_array(int n) {
   
	double* array = (double*) malloc(n*sizeof(double));
	for(int i=0; i<n; i++)
		array[i] = drand48();
	return array;
}


//original
double dotp(double* x, double
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值