OpenMP 教學(一) 深入剖析 OpenMP reduction 子句

2022-11-09 18:00:42

OpenMP 教學(一) 深入剖析 OpenMP reduction 子句

前言

在前面的教學OpenMP入門當中我們簡要介紹了 OpenMP 的一些基礎的使用方法,在本篇文章當中我們將從一些基礎的問題開始,然後仔細介紹在 OpenMP 當中 reduction 子句的各種使用方法。

從並行求和開始

我們的任務是兩個執行緒同時對一個變數 data 進行 ++操作,執行 10000 次,我們看下面的程式碼有什麼問題:

#include <stdio.h>
#include <omp.h>
#include <unistd.h>

static int data;

int main() {
  #pragma omp parallel num_threads(2) // 使用兩個執行緒同時執行上面的程式碼塊
  {
    for(int i = 0; i < 10000; i++) {
      data++;
      usleep(10);
    }
    // omp_get_thread_num 函數返回執行緒的 id 號 這個資料從 0 開始,0, 1, 2, 3, 4, ...
    printf("data = %d tid = %d\n", data, omp_get_thread_num());
  }

  printf("In main function data = %d\n", data);
  return 0;
}

在上面的程式碼當中,我們開啟了兩個執行緒並且同時執行 $pragma 下面的程式碼塊,但是上面的程式有一個問題,就是兩個執行緒可能同時執行 data++ 操作,但是同時執行這個操作的話,就存在並行程式的資料競爭問題,在 OpenMP 當中預設的資料使用方式就是