我有以下算法,我通过尝试使顺序模式查找算法并行来创建。
当我在尝试计算比较时遇到竞争条件时,我创建了一个临时变量并尝试执行减少,但是我仍然没有得到与顺序算法相同的比较量。
int hostMatch(long *comparisons)
{
int i = 0, j = 0, k = 0, lastI = textLength-patternLength;
long comparisons_tmp = 0;
int found = textLength + 1;
#pragma omp parallel for reduction(+:comparisons_tmp) \
schedule(static) \
num_threads(4) \
default(none) \
shared(found, comparisons) \
private(j, k) \
firstprivate(lastI, textData, patternData, patternLength)
for(i = 0; i<= lastI; i++)
{
if(i < found)
{
k=i; j=0;
while(textData[k] == patternData[j] && j < patternLength)
{
k++; j++; comparisons_tmp++;
}
if(j == patternLength)
{
#pragma omp critical(check)
{
if(found > i)
found = i;
}
}
}
}
*comparisons = comparisons_tmp;
// return (found < textLength + 1) ? found : -1;
if(found < textLength + 1)
return found;
else
return -1;
}
此代码返回比较量
对于test0 3994004000
,而对
3996002000
用于顺序算法比较。
原始顺序代码如下:
int hostMatch(long *comparisons)
{
int i,j,k, lastI;
i=0;
j=0;
k=0;
lastI = textLength-patternLength;
*comparisons=0;
while (i<=lastI && j<patternLength)
{
(*comparisons)++;
if (textData[k] == patternData[j])
{
k++;
j++;
}
else
{
i++;
k=i;
j=0;
}
}
if (j == patternLength)
return i;
else
return -1;
}
我不确定我是否在错误的地方递增comparisons_tmp变量,任何帮助都会感激不尽。 Test0包含一个1999 A的模式文件,后跟一个B,文本文件为199999 A,后跟一个B.
答案 0 :(得分:1)
comparisons_tmp
应该在while
- 循环之外递增。您现在缺少第一个比较,例如,如果模式的第一个字符与比较不匹配则根本没有增加。
但是,请注意,通过修复计数器位置,并行算法很可能会有更多的比较,因为OpenMP 不保证循环执行的顺序。这意味着很可能某些线程将与i
进行比较,大于found
的最终值。