OpenMP 在 for() 循环中面临的情况

Situations faced in OpenMP on for() loops

我正在为此使用 OpenMP,但我对自己的回答也没有信心。在这方面真的需要你的帮助。我一直想知道哪种方法(串行或并行)在 运行 速度方面更快。我的 #pragma 命令(设置在注释中)如下所示。

Triangle Triangle::t_ID_lookup(Triangle a[], int ID, int n)
{
    Triangle res;    int i;
    //#pragma omp for schedule(static) ordered
    for(i=0; i<n; i++)
    {
        if(ID==a[i].t_ID)
        {
            //#pragma omp ordered
            return (res=a[i]);  // <-changed into "res = a[i]" instead of "return(...)"
        }
    }
    return res;
}
  1. 这取决于n。如果 n 很小,则 OMP 线程所需的开销会使 OMP 版本变慢。这可以通过添加 if 子句来克服:#pragma omp parallel if (n > YourThreshhold)
  2. 如果所有 a[i].t_ID 都不是唯一的,那么在使用 OMP 时,相同的数据可能会收到不同的结果。
  3. 如果您的函数中有更多内容而不仅仅是单个比较,请考虑添加一个共享标志变量以指示已找到它,以便可以在循环开头添加比较 if(found) continue;
  4. 我没有使用 ordered 的经验,所以如果那是您问题的症结所在,请忽略以上所有内容并考虑 this 答案。
  5. 简介。最后,没有更好的答案。
  6. 如果您仍然想要一个理论答案,那么随机查找将是 O(n),平均值为 n/2,而 OMP 版本将是一个常数 n/k,其中 k 是数字threads/cores 不包括开销。

有关编写循环的替代方法,请参阅 Z Boson 对其他问题的回答。