parallel_for的并行语句中,如果其中的变量定义在循环体外,会导致运行时间变慢很多,不知道是不是的运用有问题。比如以下三段代码:(原代码指没有使用并行执行的代码)
代码段1运行的速率比原代码还慢,而代码段2则比原代码快很多,区别仅仅只是把int iCalcLoc定义于并行循环内外;而且很奇怪的是,定义在循环外部反而速度会更慢。代码1和2对于循环体外的byte*byteArrDestR(G/B)的数组调用却不影响。但是代码段3却出现了引用循环体外的数组后,速率比原代码速度更慢的情况(调用函数前,都已经初始化了输入参数),然而如果将iCalNumR(G/B)定义在循环体内的话,循环体外就无法调用。
搞不懂呀,难受!!!!!!
/*代码1*/
int aaaa(byte *byteArrSrcR,byte *byteArrSrcG,byte *byteArrSrcB,int AiWidth,int AiHeight ,byte*AbyteArrNewColorTmp,byte *byteArrDestR,byte *byteArrDestG,byte *byteArrDestB)
{
....
int iCalcLoc;
Concurrency::parallel_for(iMinTop,iMaxBottom,[&](int i)
{
for(int j=iMinLeft;j<iMaxRight;j++)
{
iCalcLoc=i*AiWidth+j;
if(byteArrSrcR[iCalcLoc]==0&&byteArrSrcG[iCalcLoc]==0&&byteArrSrcB[iCalcLoc]==0)
{
byteArrDestR[iCalcLoc]=iCalcMaxLoc_R;
byteArrDestG[iCalcLoc]=iCalcMaxLoc_G;
byteArrDestB[iCalcLoc]=iCalcMaxLoc_B;
}
}
});
}
/*代码2*/
int aaaa(byte *byteArrSrcR,byte *byteArrSrcG,byte *byteArrSrcB,int AiWidth,int AiHeight ,byte*AbyteArrNewColorTmp,byte *byteArrDestR,byte *byteArrDestG,byte *byteArrDestB)
{
....
Concurrency::parallel_for(iMinTop,iMaxBottom,[&](int i)
{
int iCalcLoc;
for(int j=iMinLeft;j<iMaxRight;j++)
{
iCalcLoc=i*AiWidth+j;
if(byteArrSrcR[iCalcLoc]==0&&byteArrSrcG[iCalcLoc]==0&&byteArrSrcB[iCalcLoc]==0)
{
byteArrDestR[iCalcLoc]=iCalcMaxLoc_R;
byteArrDestG[iCalcLoc]=iCalcMaxLoc_G;
byteArrDestB[iCalcLoc]=iCalcMaxLoc_B;
}
}
});
}
/*代码3*/
void aasa(int AiHeight,int AiWidth,Mat R,Mat G,Mat B,int*iCalcNumR,int*iCalcNumG,int*iCalcNumB )
{
Concurrency::parallel_for(0,AiHeight,[&](int i)
{
uchar*r=R.ptr(i);
uchar*g=G.ptr(i);
uchar*b=B.ptr(i);
for(int j=0;j<AiWidth;j++)
{
iCalcNumR[ r[j] ]++;
iCalcNumG[ g[j] ]++;
iCalcNumB[ b[j] ]++;
}
});
}