Как оптимизировать код OpenMp, например Гистограмма - PullRequest
1 голос
/ 12 января 2020

Я имею дело с огромными данными облака точек. Я пытаюсь использовать 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

У меня два вопроса

  1. Набор данных составляет не менее 10 ^ 8, я использую 128 потоков. но это медленнее, чем последовательный. Как я могу оптимизировать код

  2. Существуют ли правила, которым я могу следовать, чтобы оптимизировать код, когда возникают другие вопросы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...