我想要在两个功能相似的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()得到;
问题一:这三种实现方法 在这两个时间参数上 为什么会有这么大的差别??原因何在?
问题二:
#pragma omp atomic
num_of_degree[j]++;
怎么才能运用InterlockIncrement(&num_of_degree[m])实现?像这样的num_of_degree[]全局数组递增 怎样实现能更好一些呢?
谢谢了!