OpenMP的用法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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()得到;