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

标签 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;
}

这段代码返回比较的数量
3994004000 用于 test0,而
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 的文本文件。

最佳答案

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

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

关于c - OpenMP - 计算模式匹配中的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47099691/

相关文章:

arrays - 所有对之间的位差之和

ASP.NET:如何处理并行请求

c++ - tbb::parallel_for 将 ‘const value_type’ 作为 ‘this’ 参数传递会丢弃限定符

java - 在 Java 中并行地同时处理两个任务

c - 假设我们有一个包含节点和边的图,我们如何表示边列表。我不是在谈论邻接列表

c - C 中 pi 的无限级数逼近不终止

c - 在文件 C 中查找字符串的子字符串

java - java中的Euler Project 5,为什么有不同的结果?

c - C 语言可以从文件中读取常量吗?

c++ - 推送和弹出操作的混合序列为什么这个序列不可能