【发布时间】:2017-02-22 15:23:29
【问题描述】:
我有以下算法:
int hostMatch(long *comparisons)
{
int i = -1;
int lastI = textLength-patternLength;
*comparisons=0;
#pragma omp parallel for schedule(static, 1) num_threads(1)
for (int k = 0; k <= lastI; k++)
{
int j;
for (j = 0; j < patternLength; j++)
{
(*comparisons)++;
if (textData[k+j] != patternData[j])
{
j = patternLength+1; //break
}
}
if (j == patternLength && k > i)
i = k;
}
return i;
}
当更改 num_threads 时,我得到以下比较次数的结果:
- 01 = 9949051000
- 02 = 4992868032
- 04 = 2504446034
- 08 = 1268943748
- 16 = 776868269
- 32 = 449834474
- 64 = 258963324
为什么比较次数不是恒定的?这很有趣,因为比较的数量随着线程数量的翻倍而减半。 (*comparisons)++ 是否存在某种竞争条件,如果变量正在使用,OMP 会跳过增量?
我目前的理解是 k 循环的迭代在线程之间几乎均匀分布。每次迭代都有一个私有整数 j 以及一个整数 k 的私有副本,以及一个添加到比较直到终止的非并行 for 循环。
【问题讨论】:
-
如果你知道竞态条件是什么,你为什么要在那里激怒它。您甚至说某些变量在线程之间被拆分,并且比较显然不是其中之一,所有线程都相同。
标签: c for-loop parallel-processing openmp