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;
}
- 这取决于
n
。如果 n
很小,则 OMP 线程所需的开销会使 OMP 版本变慢。这可以通过添加 if
子句来克服:#pragma omp parallel if (n > YourThreshhold)
- 如果所有
a[i].t_ID
都不是唯一的,那么在使用 OMP
时,相同的数据可能会收到不同的结果。
- 如果您的函数中有更多内容而不仅仅是单个比较,请考虑添加一个共享标志变量以指示已找到它,以便可以在循环开头添加比较
if(found) continue;
。
- 我没有使用
ordered
的经验,所以如果那是您问题的症结所在,请忽略以上所有内容并考虑 this 答案。
- 简介。最后,没有更好的答案。
- 如果您仍然想要一个理论答案,那么随机查找将是 O(n),平均值为 n/2,而 OMP 版本将是一个常数 n/k,其中 k 是数字threads/cores 不包括开销。
有关编写循环的替代方法,请参阅 Z Boson 对其他问题的回答。
我正在为此使用 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;
}
- 这取决于
n
。如果n
很小,则 OMP 线程所需的开销会使 OMP 版本变慢。这可以通过添加if
子句来克服:#pragma omp parallel if (n > YourThreshhold)
- 如果所有
a[i].t_ID
都不是唯一的,那么在使用OMP
时,相同的数据可能会收到不同的结果。 - 如果您的函数中有更多内容而不仅仅是单个比较,请考虑添加一个共享标志变量以指示已找到它,以便可以在循环开头添加比较
if(found) continue;
。 - 我没有使用
ordered
的经验,所以如果那是您问题的症结所在,请忽略以上所有内容并考虑 this 答案。 - 简介。最后,没有更好的答案。
- 如果您仍然想要一个理论答案,那么随机查找将是 O(n),平均值为 n/2,而 OMP 版本将是一个常数 n/k,其中 k 是数字threads/cores 不包括开销。
有关编写循环的替代方法,请参阅 Z Boson 对其他问题的回答。