openmp数据依赖/等待var

时间:2017-06-19 18:15:36

标签: c openmp

如何使用OpenMP解决以下问题:

编辑: Panni是对的,我的并行方法不起作用,那么这样做的好方法是什么?

情况:

函数调用顺序:

  1. 计算值();
  2. 移动();
  3. 函数<script type="text/javascript"> $(document).ready(function() { $('#showdiv').fadeOut(); var timedelay = 1; function delayCheck() { if(timedelay > 5) { $('#showdiv').fadeIn(); if(timedelay == 12) { window.location = "https://www.google.com"; } timedelay = timedelay+1; } } // closing the function $(document).mousemove(function() { $('#showdiv').fadeOut(); timedelay = 1; clearInterval(_delay); _delay = setInterval(delayCheck, 900); }); // page loads starts delay timer _delay = setInterval(delayCheck, 900) }); </script> 通过calc()并行化循环,并更改包含#pragma omp parallel forx值的结构的数组。

    函数y仅通过move()并行化循环,并访问#pragma omp for中更改的值。

    问题:

    在访问函数calc()之前,如何在OpenMP中确保函数1已设置值?

    更具体:

    2

    那么,我怎样才能确保#include <...> static b_t *b; static void calc() { #pragma omp parallel for private(j) for(i = 0; i < n - 1; i++) for(j = i + 1; j < n; j++) { b[i].f.x += some_value; b[i].f.y += some_value; b[j].f.x -= some_value; b[j].f.y -= some_value; } } } static move() { #pragma omp for for (i = 0; i < n; i++) { d.x = b[i].f.x; d.y = b[i].f.y; } } int main() { for (i = 0; t < end; t += dt) { calc(); move(); } } 仅在move()之后调用?我想过calc(),但它似乎并不适合我。

2 个答案:

答案 0 :(得分:0)

由于您按顺序调用函数calc()move()calc()函数将始终首先执行。

所以程序运行calc()等待它完成(无论使用了多少个线程)然后继续运行move()

答案 1 :(得分:0)

潘尼已经说了我想说的话。

很糟糕我仍然无法发表评论。 而且我不想像这样回答。

所以我猜你可能会因为两个原因而遇到性能问题。

  1. 三角形上的不平衡工作负载调度。
  2. 如果缓存无法容纳整个 b ,则
  3. 缓存未命中问题。
  4. 移动func对我来说很奇怪,所以我没有考虑到它。