C++ 如何优化OpenMp代码,例如直方图

C++ 如何优化OpenMp代码,例如直方图,c++,optimization,parallel-processing,openmp,C++,Optimization,Parallel Processing,Openmp,我正在处理大量的点云数据。我尝试使用OpenMp。 但我发现初学者很难优化代码。 例如,当我想要获取点云的直方图时(该点具有x、y、z以外的其他信息)。我在下面写代码 #pragma omp parallel num_threads(N_THREAD) shared(hist,partHist) { int tId = omp_get_thread_num(); int index = tId * partCount; #pragma

我正在处理大量的点云数据。我尝试使用OpenMp。 但我发现初学者很难优化代码。 例如,当我想要获取点云的直方图时(该点具有x、y、z以外的其他信息)。我在下面写代码

 #pragma omp parallel num_threads(N_THREAD) shared(hist,partHist)
    {
        int tId = omp_get_thread_num();
        int index = tId * partCount; 
        #pragma omp for nowait
        for(int i =0;i<partCount;++i)
        {
            if (index + i < size)
                #pragma omp atomic
                partHist[tId][(int)floor((array[index + i] - minValue) / stride)]++;
        }
        #pragma omp critical
        {
            for (int i = 0; i < binCount; ++i)
                hist[i] += partHist[tId][i];
        }
    }
#pragma omp parallel num_threads(N_THREAD)shared(hist,partHist)
{
int tId=omp_get_thread_num();
int index=tId*零件数量;
#nowait的pragma omp

对于(int i=0;iIt使用
std::thread
s或
pthreads
可能会更快,但在任何情况下,您都希望重构多线程,以最小化线程休眠和恢复、线程构造和销毁。代码是疯狂的-所有工作(根本没有太多)在原子或关键段内。原子和关键段都有效地序列化执行;它们在并行段内使用较少。在8核处理器上运行128个线程也可能不是一个好主意。首先使代码并行,然后在8个线程上运行,看看如何你开始吧。使用
std::thread
s或
pthreads
可能会更快,但无论如何,你都会希望重构多线程,以最小化线程休眠和恢复、线程构造和破坏。代码很疯狂——所有的工作都在进行中(而且根本没有太多)在原子或关键段内。原子和关键段都有效地序列化执行;它们在并行段内使用较少。在8核处理器上运行128个线程也可能不是一个好主意。首先使代码并行,然后在8个线程上运行,看看如何你上车。