在OpenMP中双重免费或损坏

时间:2013-03-30 22:58:30

标签: openmp

我正在尝试实现并行强力子串搜索算法。每个线程都有一个起始和结束索引,因为我用4个线程运行它,每个线程将完成四分之一的工作。

现在,当我运行该函数一次时,一切都非常好(适用于4个线程),但是由于函数是void类型,我将结果存储(子字符串位于较大字符串中的索引)全局变量'ans'。

int ans = -1;

void bruteForce(string mainString, string subString)
{
    int tid, nthreads;
    #pragma omp parallel private (tid) shared (nthreads, ans)
    {
        tid = omp_get_thread_num();
        nthreads = omp_get_num_threads();
        int j = 0;
        int start = tid * (mainString.size() / nthreads);
        int end = start + mainString.size() / nthreads;

        for(int i = start; i < end; i++)
        {
            if(ans == -1)
            {
                while(j < subString.size())
                {
                    if(mainString[i + j] != subString[j]) break;
                    if(j == subString.size() - 1)
                    {
                        #pragma omp critical
                        {
                            #pragma omp flush
                            ans = i;
                        }
                    }
                    j++;
                }
                j = 0;
            }
        }
    }
}

我想要做的是,在函数完成之后或启动之前将'ans'重置为-1,但是当我尝试这样做时,我得到了这个错误,以及内存映射和回溯。< / p>

double free or corruption (out): 0xb5b00468 ***

是否有理由不能在for循环播放中将'ans'更改为-1?

    start = get_timestamp();
    for(int x = 0; x < N; x++)
    {
        show_percent(x, N);
        bruteForce(STRING, WORD);
    }
    end = get_timestamp();

2 个答案:

答案 0 :(得分:2)

这与改变ans无关。您需要在 brutForce()的while循环中对(i + j)设置限制。

假设mainString =“THIS”和subString =“XXX”。 所以每个线程都有

  

T | H |我|小号

对于最后一个帖子,你的开始= 3,结束= 4。 subString.size()= 3;

所以在while循环中你正在访问mainString [i + j],其中j = 0-&gt; 2 ==&gt; (i + j)= 3-> 5。

答案 1 :(得分:0)

正如问题的原始海报所述:


<强>解

这是代码的固定版本和工作版本。我刚刚开始搞乱OpenMP,看起来你如何以及在何处声明你的变量以及如何将它们传递给各个线程似乎非常挑剔,所以如果有人能够告诉我为什么这些更改修复了代码,那太好了。此外,#pragma omp parallel for i大大提高了该计划的性能。

int ans = -1;

void bruteForce(const string mainString, const string subString)
{
    ans = -1;
    int tid, nthreads, start, end, j, i;
    #pragma omp parallel private (tid, start, end, j) shared (nthreads, ans)
    {
        tid = omp_get_thread_num();
        nthreads = omp_get_num_threads();
        start = tid * (mainString.size() / nthreads);
        end = start + mainString.size() / nthreads;
        if(tid == (nthreads - 1)) 
            end = end - subString.size();
        j = 0;

        #pragma omp parallel for
        for(i = start; i < end; i++)
        {
            if(ans == -1)
            {
                while(j < subString.size())
                {
                    if(mainString[i + j] != subString[j]) break;
                    if(j == subString.size() - 1)
                    {
                        #pragma omp critical
                        {
                            ans = i;
                        }
                    }
                    j++;
                }
                j = 0;
            }
        }
    }
}