OpenMP

基本原理

  • Fork/Join多线程模型
  • 在线程级别采用共享内存并行计算模型
  • 程序员需要自我处理好并行逻辑问题

基础API

  • Construct构建语句(和编程语句一样,引导编译器做处理)
    • Parallel声明下面的代码块将进行并行处理
      • #pragma omp parallel [clause[``[,] clause]...] structured block
      • clauses
        • if(scalar-expression)
        • num_threads(integer-expression)
        • private(list)
        • firstprivate(list)
        • shared(list)
        • default(none|shared)
        • copyin(list)
        • reduction(operator:list)
    • Work-Sharing以下代码将进行多线程改写
      • iterations over the threads 不依赖迭代
        • #pragma omp for [clause[``[,] clause]...] for-loop
        • clauses
          • private(list)
          • firstprivate(list)
          • lastprivate(list)
          • reduction(operator:list)
          • ordered
          • schedule(kind[,chunk_size])
          • nowait
      • independent work units相互独立的代码单元
        • #pragma omp sections [clause[``[,] clause]...] { [#pragma omp section] structured block [#pragma omp section] structured block ...... }
        • clauses
          • private(list)
          • firstprivate(list)
          • lastprivate(list)
          • reduction(operator:list)
          • nowait
      • Only one thread executes the code block只有一个线程运行的代码单元
        • #pragma omp single [clause[``[,] clause] ...] structured block
        • clauses
          • private(list)
          • firstprivate(list)
          • copyprivate(list)
          • nowait
      • Combined Parallel
    • Synchronization用于线程同步
      • barrier
        • pragma omp barrier

        • 这此处所有线程全部执行完,同步后继续执行
      • Ordered
        • #pragma omp ordered structured block
        • 指定接下來被程式,在被平行化的 for 迴圈將依序的執行。 Specifies that code under a parallelized for loop should be executed like a sequential loop.
      • critical
        • #pragma omp critical [(name)] structured block
        • block中的语句将通过锁机制来维护执行的单一性
        • 通过名字name来实现不同地方的锁机制
      • atomic
        • #pragma omp atomic statement
        • 语句原子化执行
      • master
        • #pragma omp master structured block
        • 只有主线程执行
  • Clauses附加修饰和条款
    • shared(list)
      • 利用这个有效区域的变量
      • 利用指针来达到效果
    • private(list)
      • 在各自线程内部创建一个副本
      • 利用传值的效果
    • lastprivate(list)
      • 按逻辑先后将最后一个被赋值的数据作为本数据域的结果
    • firstprivate(list)
      • 用于初始化
      • 在各个线程中可能需要用到外面的初始数据
    • default(none|shared)
      • 给下面所有的数据指定默认区间
      • none:不指定,需要程序员逐个设置
      • shared:默认都为shared(....)
    • nowait
      • 忽略 barrier(等待)。 Overrides the barrier implicit in a directive.
    • schedule(kind[,chunk_size])
      • kind
        • 有 dynamic、guided、runtime、static 四種方法。
        • 各个线程的for迭代范围
      • 設定 for 迴圈的平行化方法;
    • if(scalar-logical-expression)
    • num_threads(scalar-integer-expression)
    • reduction(operator:list)
      • operator:initial ization value
        • *:0
        • *:1
        • -:0
        • &:~0
        • |:0
        • ^:0
        • &&:1
        • ||:0
      • 对于特殊类型还是得借助critical

                     sum=0;
            #pragma omp parallel shared(n,a,sum) private(TID,sumLocal)
            {
                  TID = omp_get_thread_num();
                  sumLocal = 0;
                  #pragma omp for
                     for(i=0;i<n;i++)
                         sumLocal += a[i];
                  #pragma omp critical (update_sum)
                  {
                        sum += sumLocal;
                        printf("TID=%d: sumLocal=%d sum=%d\n",TID,sumLocal,sum);
                  }
            }
            
      

     </blockquote>

学习资源

tags: MultiCPU



创建@

2011-07-21

最后修改@

2013-05-04

标签/Tags

相同类目/Categories