代码之家  ›  专栏  ›  技术社区  ›  Sayan

OpenMP-在块上执行线程

  •  0
  • Sayan  · 技术社区  · 14 年前

    我有下面这段代码,我想以某种方式使其并行。我犯了一个错误,因此并不是所有线程都像我认为的那样运行循环。如果有人能帮我找出那个错误,那就太好了。

    这是一个计算柱状图的代码。

    #pragma omp parallel default(shared) private(iIndex2, iIndex1, fDist) shared(iSize, dense) reduction(+:iCount)
    {
    
    chunk = (unsigned int)(iSize / omp_get_num_threads());
    threadID = omp_get_thread_num();
    svtout << "Number of threads available " << omp_get_num_threads() << endl;
    svtout << "The threadID is " << threadID << endl;
    
    //want each of the thread to execute the loop
        for (iIndex1=0; iIndex1 < chunk; iIndex1++)
        {
            for (iIndex2=iIndex1+1; iIndex2 < chunk; iIndex2++)
            {   
                iCount++;
    
                fDist = (*this)[iIndex1 + threadID*chunk].distance( (*this)[iIndex2 + threadID*chunk] );
                idx = (int)(fDist/fWidth);
    
                if ((int)fDist % (int)fWidth >= 0)
                {
                   #pragma omp atomic
                   dense[idx] += 1;
                }  
    }
    }
    

    ICount变量跟踪迭代次数,我注意到串行版本和并行版本之间存在显著的差异。我想不是所有线程都在运行,因此我从并行程序中获得的柱状图值远小于实际读数(密集数组存储柱状图值)。

    谢谢,
    萨扬

    1 回复  |  直到 14 年前
        1
  •  2
  •   Anycorn    14 年前

    您是块上的循环,而不是使用多个线程。 尝试用isize替换循环边界。