[英]Parallelizing function using OpenMP and C
我正在嘗試轉換函數“integrate_openMP”,它實現了梯形規則,以便它可以並行運行。 我懷疑函數的哪些部分應該由“關鍵”編譯指示來管理,以及如何處理關於OpenMP的計算本身。
該函數使用pragma的#pragma omp parallel和#pragma omp single來自main。
謝謝
我已經初步嘗試並行化該函數更新了代碼
double integrate_openMP(double a, double b, double (*f)(double), double e)
{
calls++;
double int_result;
double m = (a + b) / 2;
double one_trap_area = (b - a) * (f(a) + f(b)) / 2;
double two_trap_area = (b - a) * (f(a) + f(b) + 2 * f(m)) / 4;
if (fabs(one_trap_area - two_trap_area) <= e)
{
return two_trap_area;
}
else
{
double left_area, right_area;
#pragma omp task shared(left_area)
{
left_area = integrate_openMP(a, m, f, e / 2);
}
#pragma omp task shared(right_area)
{
right_area = integrate_openMP(m, b, f, e / 2);
}
#pragma omp taskwait
int_result = left_area + right_area;
return int_result;
}
}
double integrate_single(double a, double b, double (*f) (double), double e) {
calls ++;
double m = (a + b) / 2;
double one_trap_area = (b - a) * (f(a) + f(b)) / 2;
double two_trap_area = (b - a) * (f(a) + f(b) + 2 * f(m))/ 4;
if (fabs(one_trap_area - two_trap_area) <= e) {
return two_trap_area;
} else {
double left_area, right_area;
left_area = integrate_single(a, m, f, e/2);
right_area = integrate_single(m, b, f, e/2);
return left_area + right_area;
}
}
問自己一些問題......“這是循環的並行嗎?” 在這種情況下,omp for是有用的。 “這是遞歸並行嗎?” 在這種情況下,請閱讀openmp任務...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.