我有下面这段代码,我想以某种方式使其并行。我犯了一个错误,因此并不是所有线程都像我认为的那样运行循环。如果有人能帮我找出那个错误,那就太好了。
这是一个计算柱状图的代码。
#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变量跟踪迭代次数,我注意到串行版本和并行版本之间存在显著的差异。我想不是所有线程都在运行,因此我从并行程序中获得的柱状图值远小于实际读数(密集数组存储柱状图值)。
谢谢,
萨扬