C++ 如何优化OpenMp代码,例如直方图
我正在处理大量的点云数据。我尝试使用OpenMp。 但我发现初学者很难优化代码。 例如,当我想要获取点云的直方图时(该点具有x、y、z以外的其他信息)。我在下面写代码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
#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个线程上运行,看看如何你上车。