在前面的教學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 當中預設的資料使用方式就是