[CA-3]openMP详细介绍
阿姆达尔定律(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