Я хочу заполнить матрицу параллельно, и у меня возникают проблемы с выяснением того, как отслеживать номер итерации с помощью 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, используя эту матрицу.Есть ли более эффективный способ сделать это?