Я имею дело с огромными данными облака точек. Я пытаюсь использовать 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];
}
}
Код выполняется на Linux с i7-9700k, скомпилирован с g ++ и использует omp 4.0
У меня два вопроса
Набор данных составляет не менее 10 ^ 8, я использую 128 потоков. но это медленнее, чем последовательный. Как я могу оптимизировать код
Существуют ли правила, которым я могу следовать, чтобы оптимизировать код, когда возникают другие вопросы?