Заполняйте гистограммы (сокращение массива) параллельно с OpenMP без использования критической секции

Я хотел бы заполнить гистограммы параллельно, используя OpenMP. Я придумал два разных способа сделать это с OpenMP в C / C ++.

Первый способproccess_data_v1 делает частную переменную гистограммыhist_private для каждого потока заполняет их параллельно, а затем суммирует частные гистограммы в общую гистограммуhist вcritical раздел.

Второй способproccess_data_v2 создает общий массив гистограмм с размером массива, равным количеству потоков, заполняет этот массив параллельно, а затем суммирует общую гистограммуhist в параллели.

Второй метод мне кажется более подходящим, поскольку он избегает критической секции и суммирует гистограммы параллельно. Однако это требует знания количества потоков и вызоваomp_get_thread_num(), Я вообще стараюсь этого избегать. Есть ли лучший способ сделать второй метод, не ссылаясь на номера потоков и используя общий массив с размером, равным количеству потоков?

void proccess_data_v1(float *data, int *hist, const int n, const int nbins, float max) {
    #pragma omp parallel 
    {
        int *hist_private = new int[nbins];
        for(int i=0; i

Ответы на вопрос(1)

Ваш ответ на вопрос