Подсчитать число итераций с Fortran omp параллельно делать для индексации? - PullRequest
0 голосов
/ 10 февраля 2019

Я хочу заполнить матрицу параллельно, и у меня возникают проблемы с выяснением того, как отслеживать номер итерации с помощью OpenMP.

Это моя текущая подпрограмма:

subroutine predictions(N, N_samples, idx_new_a, idx_new_b, idx_new_c, K, &
                         pred_idx_a, pred_idx_b, pred_idx_c, X, meanX, sdX, &
                         a, b, c, beta, mu_a, sigma_a ,  sigma_b, sigma_c, &
                         y_pred_draws, nthreads) bind(C, name="predictions_")
  integer, intent(in)                                     :: N, N_samples, &
                                                             idx_new_a, &
                                                             idx_new_b, &
                                                             idx_new_c, &
                                                             K, nthreads
  integer, dimension(N), intent(in)                       :: pred_idx_a, &
                                                             pred_idx_b, &
                                                             pred_idx_c
  double precision, dimension(N,K), intent(in)            :: X
  double precision, dimension(K), intent(in)              :: meanX, sdX
  double precision, dimension(N_samples,idx_new_a-1), intent(in)      :: a
  double precision, dimension(N_samples,idx_new_b-1), intent(in)      :: b
  double precision, dimension(N_samples,idx_new_c-1), intent(in)      :: c
  double precision, dimension(N_samples,K), intent(in)    :: beta
  double precision, dimension(N_samples), intent(in)      :: mu_a, sigma_a , &
                                                             sigma_b, sigma_c
  integer, dimension(N_samples*N,4), intent(out)          :: y_pred_draws
  integer                                                 :: n_rows, idx, &
                                                             sample, iter
    iter = 0

    !$ call omp_set_num_threads(nthreads)
    !$omp parallel do
    do idx=1,N
       do sample=1,N_samples
              iter = iter + 1                 ! I KNOW THIS IS WRONG BUT I'M NOT SURE HOW TO FIX IT
          !WRITE(*,*)  'Iteration ', iter
          y_pred_draws(iter, 1) = idx
          y_pred_draws(iter, 2) = sample
          CALL pred_iter_idx(N, N_samples, idx_new_a, idx_new_b, idx_new_c, K, &
                             idx, sample,pred_idx_a, pred_idx_b, pred_idx_c, &
                             X, meanX, sdX,a, b, c, beta, mu_a, sigma_a ,  &
                             sigma_b, sigma_c, y_pred_draws(iter, 3), &
                             y_pred_draws(iter, 4))
       end do
    end do
    !$omp end parallel do



end subroutine predictions

Единственное решение, которое я могу придумать, - это создать матрицу вне цикла OpenMP, которая имеет 3 столбца: N, N_samples и iter.Тогда я бы сделал мой цикл OpenMP, используя эту матрицу.Есть ли более эффективный способ сделать это?

...