закрытая переменная вне параллельного цикла for - PullRequest
0 голосов
/ 10 октября 2018

Я хочу знать, сколько времени каждый поток использует в цикле for.Я хочу, чтобы time_taken был приватным для каждого потока, чтобы они могли добавлять туда свое время.Лучше всего, я бы хотел общее время для каждого потока, а не время для каждой итерации в цикле while.

double time_taken = 0.0;

while(delta >= epsilon) {
    delta = 0.0;

    double wtime = omp_get_wtime();

    #pragma omp parallel for reduction(+:delta)
    for (i = 0; i < workSize; i++) { 
        #do some work and change delta
    }
    time_taken += omp_get_wtime() - wtime
    printf("time taken by thread %d: %f\n", omp_get_thread_num(), time_taken);
}

Я пытался сделать тайм-тайм закрытым внутри цикла while следующим образом:

double time_taken = 0.0;

while(delta >= epsilon) {
    delta = 0.0;

    #pragma omp private(time_taken)
    {
        double wtime = omp_get_wtime();

        #pragma omp parallel for reduction(+:delta)
        for (i = 0; i < workSize; i++) { 
            #do some work and change delta
        }
        time_taken += opm_get_wtime() - wtime
        printf("time taken by thread %d: %f\n", omp_get_thread_num(), time_taken);
    }
}

Я также изучил использование threadprivate, но не могу понять, как правильно его использовать.

1 Ответ

0 голосов
/ 11 октября 2018

Вы можете попробовать что-то вроде кода ниже.Это выделяет массив указателей с размером, равным количеству потоков, а затем каждый поток выделяет личную память, т.е. без ложного совместного использования.

#include <omp.h>
#include <stdio.h>
#include <stdlib.h>

int main(void) {
  double delta = 20, epsilon = 0;
  double **time_taken; 
  omp_set_dynamic(0);

  #pragma omp parallel
  {
    int it = omp_get_thread_num();
    #pragma omp single
    time_taken = malloc(sizeof *time_taken * omp_get_num_threads());
    time_taken[it] = malloc(sizeof *time_taken[omp_get_thread_num()]);
    *time_taken[it] = 0.0;
  }

  double sum = 0;
  while(delta >= epsilon) {
    #pragma omp parallel
    {
      int it = omp_get_thread_num();
      *time_taken[it] -= omp_get_wtime();
      #pragma omp for reduction(+: sum)
      for(int i= 0 ; i<2000000000; i++) sum += 1.0*i, delta -=1;
      *time_taken[it] += omp_get_wtime();
    }
  }
  printf("sum %f\n", sum);

  #pragma omp parallel
  {
    int it = omp_get_thread_num();
    printf("time taken by thread %d: %f\n", it, *time_taken[it]);
    free(time_taken[omp_get_thread_num()]);
    #pragma omp barrier
    #pragma omp single
    free(time_taken);
  }
}
...