OpenMP
包含头文件
#include<omp.h>声明并行段开始
#pragma omp paralled; { int ID=omp_get_thread_num(); printf("hello(%d)\n",ID); printf("world(%d)\n",ID) }编译运行
gcc paralle.c -fopenmp -o paralle完整代码结构
#include <stdio.h> #include <stdlib.h> #include <omp.h> int main(){ int ID,nthread; omp_set_num_threads(2); #pragma omp parallel { ID=omp_get_thread_num(); //获取每个线程的id编号 printf("hello(%d)\n",ID); printf("world(%d)\n",ID); if(ID==0){ nthread=omp_get_num_threads(); //获取开辟的线程数目,主进程的线程id默认为0 printf("Number of threads %d\n",nthread); } } return 0; }输出结果
hello(1) world(1) hello(0) world(1)
:waring: 这是由于线程编号ID定义在公共内存区域,当进行并发时两个线程同时进行默认是ID=0的主线程先执行;所以当执行到if判断语句时,两个线程对ID的赋值语句都已经结束;所以不会进入if语句
改变 ID的作用域
当将ID放在parallel作用域时,只对单个线程可见;所用最终结果会进入到if判断语句
使用并发求PI
PAD模式代码
NUM_THREADS为对应的线程数
num_steps 为步长
数组的读取可以同步进行,没一行是一个数组指针
并行域代码
伪共享模式,当使用一纬数组时,数组的读取被锁定,因为数组只有一个数组指针
窜行模式
输入同样的步长进行比较
Last updated
Was this helpful?