OpenMP - 计算模式匹配中的比较

时间:2017-11-03 15:50:29

标签: c algorithm parallel-processing pattern-matching openmp

我有以下算法,我通过尝试使顺序模式查找算法并行来创建。

当我在尝试计算比较时遇到竞争条件时,我创建了一个临时变量并尝试执行减少,但是我仍然没有得到与顺序算法相同的比较量。

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.

1 个答案:

答案 0 :(得分:1)

comparisons_tmp应该在while - 循环之外递增。您现在缺少第一个比较,例如,如果模式的第一个字符与比较不匹配则根本没有增加。

但是,请注意,通过修复计数器位置,并行算法很可能会有更多的比较,因为OpenMP 保证循环执行的顺序。这意味着很可能某些线程将与i进行比较,大于found的最终值。