2010-06-29 47 views
0

我有以下一段代码,我想以某种方式进行并行处理。我犯了一个错误,因此并不是所有线程都像我认为的那样运行循环。如果有人能帮我找出那个错误,那将是非常好的。OpenMP - 在块上执行线程

这是计算直方图的代码。

#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变量记录迭代次数,我注意到串行版本和并行版本之间存在显着差异。我猜并不是所有的线程都在运行,因此我从并行程序获得的直方图值远远小于实际读数(密集数组存储直方图值)。

感谢,
萨扬

回答

2

你是一个遍历块,而不是iSize有一个以上的线程。 尝试用iSize替换循环边界。

+0

是的,它会工作,但我想如果我可以让每个线程并行运行for循环,那么iSize的整个范围将被覆盖(因此下标就像[i + threadNum * chunk]) ,并且可能它会比在外部循环中放置一个平行和在稠密之前放置一个杂注原子更快。但我想我应该删除完整的杂注。 – Sayan 2010-06-29 16:21:49

+0

对不起,我能够通过使用OpenMP论坛中描述的策略来加快代码的执行速度。可以帮助像我这样的新手。 - http://openmp.org/forum/viewtopic.php?f=3&t=896 – Sayan 2010-07-07 03:11:20