OpenMP學習 使用梯形對函式積分

2021-10-02 18:22:37 字數 1952 閱讀 2647

乙個簡單的例項。使用梯形積分法來估計曲線下方所包圍的面積。假設 f(x) 是乙個合理的函式 a

我們可以將[a, b]劃分為多個區間,在每乙個子區間上使用梯形近似估計該區域的面積。假設每個子區間寬度為h,定義 h=(b-a)/n, xi=a+i*h, i = 0, 1, 2, ……, n,那麼近似值為:

h[

f(x0)/2

+f(x1)

+ … +

f(xn-1)

+f(xn)/2

]

現在就是將其並行化,由於每個梯形的計算任務是無關的,因此我們可以將這些任務平均分配給執行緒們。我們將任務具體劃分為兩種:

單個梯形面積的計算。

梯形面積的求和。

在這裡,我們假設梯形的數量遠大於執行緒(核)的數量。通過給每個執行緒分配連續的梯形塊來聚集任務,每個執行緒對它的子區間簡單的採用序列梯形積分法。

由於最終需要將所有子結果累加起來,因此涉及到對乙個共享變數的操作。引入:

# pragma omp critical
來表明該變數是乙個共享資源,一次只能被乙個執行緒更新。

示例程式如下:

#include

#include

#include

void

trap

(double a,

double b,

int n,

double

* global_result_p)

;doublef(

double x)

;int

main

(int argc,

char

* ar**)

void

trap

(double a,

double b,

int n,

double

* global_result_p)

my_result = my_result*h;

# pragma omp critical

*global_result_p +

= my_result;

}doublef(

double x)

特別指出:

h 為每個小梯形的高(底)

local_n 為給每個執行緒分配的梯形數目

local_a 執行緒區間的左端點

local_b 執行緒區間的右端點

my_result 對 global_result 貢獻的部分和

此外,注意到 n/thread_count 得到的結果並不一定為整數,當結果不為整數時,最終用於估算的梯形數目將小於實際給出的梯形數目,所以採用錯誤檢查來檢查 n 是否被 thread_count 整除:

if

(n % thread_count !=0)

驗證一下結果:

$ clang -o main.out main.c -xpreprocessor -fopenmp -lomp

$ ./main.out 10

enter a, b, and n13

100thread number is 10.

with n =

100 trapezoids, our estimate

of the integral from 1.000000 to 3.000000

=3.80008000000000e+01

.

《並行程式設計導論》

函式定義(對函式定義的使用)函式呼叫

對於函式呼叫,首先我們一定先要理解函式定義 函式定義 1.返回值型別 乙個函式可以返回乙個值,在函式定義中 2.函式名 給函式起個名稱 3.函式體語句 花括號內的 函式內需要執行的語句 4.return 表示式 和返回值型別掛鉤,返回相應的資料 語法 返回值型別 函式名 引數列表 例如我們來寫乙個加...

對pandas replace函式的使用方法小結

語法 replace self,to replace none,value none,inplace false,limit none,regex false,method pad axis none 使用方法如下 import numpy as np import pandas as pd df ...

Python學習記錄 Python函式及物件

1.函式操縱 a.函式定義 b.引數的定義 定參與不定參以及函式過載 c.引數預設值 d.傳遞引用和引用外部變數 e.修改全域性變數 f.lambda寫法 和 函式傳遞 g.函式內定義函式 2.物件操縱 1 物件定義 a.建構函式和析構函式 b.定義成員變數和成員方法 c.定義私有成員和公有成員 d...