C OpenMP对性能的影响
我试图使用openMP并行化一个脚本,但当我测量它的执行时间(使用C OpenMP对性能的影响,c,multithreading,performance,parallel-processing,openmp,C,Multithreading,Performance,Parallel Processing,Openmp,我试图使用openMP并行化一个脚本,但当我测量它的执行时间(使用omp\u get\u thread\u num)时,结果非常奇怪 如果我将线程数设置为2,它将测量4935 us 将其设置为1大约需要1083美元 删除每个openmp指令只会使其变成9个us 这是我所说的脚本的一部分(这个循环嵌套在另一个循环中) (j=(i-1);j>=0;j--)的{ a=0; #pragma-omp并行 { #布拉格omp单曲 { if(arreglo[j]>y){ arreglo[j+2]=
omp\u get\u thread\u num
)时,结果非常奇怪
- 如果我将线程数设置为2,它将测量4935 us
- 将其设置为1大约需要1083美元
- 删除每个openmp指令只会使其变成9个us
{
a=0;
#pragma-omp并行
{
#布拉格omp单曲
{
if(arreglo[j]>y){
arreglo[j+2]=arreglo[j];
}
else if(arreglo[j]>x){
如果(!标志[1]){
arreglo[j+2]=y;
标志[1]=1;
}
arreglo[j+1]=arreglo[j];
}
}
#布拉格omp单曲
{
if(arreglo[j]
我们谈论的是一个非常短的执行时间,它很容易受到用于基准测试的环境的影响
很明显,您使用的输入大小不足以证明并行性的开销
您当前的设计只允许2
线程;没有扩展空间
与其使用single
构造函数,不如根据线程ID
静态划分这两个代码分支,这样可以节省single
构造函数的开销
最后一个屏障是多余的,因为#pragma omp parallel
在其底部已经有一个隐式屏障
此外,您的代码看起来本质上是顺序的,并且在当前的设计中,代码显然不适合并行
如果我将线程数设置为2,那么将其设置为4935 us
1大约需要1083 us,删除每个openmp指令将使
我们只有9个人
使用2
线程,您将支付所有同步开销;使用1
线程,您将支付使用openMP
的代价。最后,在没有并行化的情况下,您只需删除所有开销,从而降低执行时间
顺便说一句,您不需要删除OpenMP指令,只需编译不带-fopenmp
标志的代码,指令将被忽略
for(j=(i-1); j>=0;j--){
a=0;
#pragma omp parallel
{
#pragma omp single
{
if(arreglo[j]>y){
arreglo[j+2]=arreglo[j];
}
else if(arreglo[j]>x){
if(!flag[1]){
arreglo[j+2]=y;
flag[1]=1;
}
arreglo[j+1]=arreglo[j];
}
}
#pragma omp single
{
if(arreglo[j]<=x){
arreglo[j+1]=x;
flag[0]=1;
a=1;
}
}
#pragma omp barrier
}
if (a==1){break;}
}