OpenMP的用法

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

在双重循环中怎样写OpenMP?

那要分析你的外循环跟内循环有没有彼此依赖的关系

unsigned int nCore = GetComputeCore();

unsigned int nStep = IMAGETILEYSIZE / nCore;

#pragma omp parallel for private(Level0_x, Level0_y, ChangeLevel0_x, ChangeLevel0_y, InterX1, InterX2, InterY1, InterY2)

for (int k = 0; k < nCore; k++)

{

int begin = k * nStep;

int end = (k + 1) * nStep;

for (int YOff = begin; YOff < end; YOff++)

{

for (int XOff = 0; XOff < IMAGETILEXSIZE; XOff++)

{

Level0_x = pPixelXBuf[YOff][XOff];

Level0_y = pPixelYBuf[YOff][XOff];

ChangeLevel0_x = Level0_x - XMin;

ChangeLevel0_y = Level0_y - YMin;

//寻找坐标在Level1Buf中对应的4个像素值

InterX1 = (int)(ChangeLevel0_x);

InterX2 = (int)(ChangeLevel0_x + 1);

InterY1 = (int)(ChangeLevel0_y);

InterY2 = (int)(ChangeLevel0_y + 1);

//双线性插值对Level0_Buf赋值

ZoomInterpolation(Level0Buf, Level1Buf, ChangeLevel0_x, ChangeLevel0_y, SamplesPerPixel, nXSize,

nYSize, InterX1, InterX2, InterY1, InterY2, XOff, YOff);

}

}

}

我也想应该这样,可是如果nCore=1的时候,外循环只循环一次,线程是怎么分配的呢。其实最外层的循环如果很多,就在外循环分配线程是不是就可以不考虑里面的循环了?

nCore = 1,就是单核单cpu,多核循环就跟普通的循环没有差别,

openmp默认有几个内核就开几个线程同时运行。所以单核openmp也没有什么意义,此时你也可以开两个线程“同时”运行,但在单核机器上,两个线程是不可能同时运行的

可以不考虑里面的循环。你只要保证外循环跟外循环之间,内寻环跟内循环之间没有数据依赖关系就行。

假设

for (int i = 0; i < 200000000; i++)

在双核的机器上,第一个线程从0到100000000,第二个从100000000到200000000,两个循环同时运行,但是10000000是依赖9999999,或者第一个的其他数值,那就不能用openmp 来并行,或者要改变并行的方式

我给你的例子中,是一个对2G的图像进行L0_L1转换的一段重采样代码,首先取图像的一块,如512*512,

判断有几个内核,然后将512分给内核,那么每个内核处理的内存大小就是512*512/ncore,这几个内核同时对这个512*512大小的内存进行重采样,因为图像数据间彼此没有依赖关系,每个像素对应一个RGB值。所以可以用openmp.

请问:openmp这三种实现方法的本质差别

我想要在两个功能相似的for循环中使用并行,使用了如下三种方法:

1,并行度:4.53%;使用并行的函数运行时间:78031;

#pragma omp parallel for nowait firstprivate(cipher0,plain,cipher1,Key) private(j)

for(i=0;i <(Nbits_Plaintext-2);i++)

{

plain[i]=1;

for(j=(i+1);j <(Nbits_Plaintext-1);j++)

{

plain[j]=1;

degree_0(cipher0);

desfunc(cipher1,plain,Key);

if(cipher1[j])

{

#pragma omp atomic

num_of_degree[j]++;//InterlockIncrement(&num_of_degree[m]);

}

plain[i]=0;

}

}

#pragma omp parallel for firstprivate(cipher0,plain,cipher1,Key) private(j)

for(i=0;i <(Nbits_Plaintext-2);i++)

{

Key[i]=1;

for(j=(i+1);j <(Nbits_Plaintext-1);j++)

{

Key[j]=1;

degree_0(cipher0);

desfunc(cipher1,plain,Key);

if(cipher1[j])

{

#pragma omp atomic

num_of_degree[j]++;

}

Key[i]=0;

}

}

2,并行度:4.35%;使用并行的函数运行时间:78571;

#pragma omp parallel

{

#pragma omp for nowait firstprivate(cipher0,plain,cipher1,Key) private(j,k,m)

for(i=0;i <(Nbits_Plaintext-2);i++)

{…}

#pragma omp for firstprivate(cipher0,plain,cipher1,Key) private(j,k,m)

for(i=0;i <(Nbits_Plaintext-2);i++)

{…}

}

3, 并行度:5.49%;使用并行的函数运行时间:51453;

#pragma omp parallel firstprivate(cipher0,plain,cipher1,Key) private(i,j,k,m)

{

#pragma omp sections

{

#pragma omp section

{

for(i=0;i <(Nbits_Plaintext-2);i++)

{…}

}

#pragma omp section

{

for(i=0;i <(Nbits_Plaintext-2);i++)

{…}

}

}

}

其中,并行度是由Intel thread profiler分析得到的,而运行时间是根据finish_clock()-start_clock()得到;

相关文档
最新文档