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?