Мне нужно сгенерировать случайный массив индексов, то есть уникальных целых чисел, начиная с 1.
Пока у меня есть этот последовательный код на Фортране:
subroutine rperm3(N, p)
integer, intent(in) :: N
integer, dimension(:), intent(out) :: p
integer :: j, k, l
real :: u
call random_seed()
p = 0
do j=1,N
call random_number(u)
k = floor(j*u) + 1
p(j) = p(k)
p(k) = j
call sleep(2)
end do
end subroutine rperm3
На каждой итерации генерируется случайный индекс, значение из этого индекса присваивается позиции текущего индекса, а старое значение перезаписывается самим текущим индексом.
Но есть ли способ распараллелить это с OpenMP? Я вижу, что просто использовать !$omp parallel for
невозможно, так как мы используем предыдущие значения массива, которые не должны быть назначенным в то время, когда они необходимы.
И если нет способа сделать это, есть ли другой параллельный алгоритм, делающий то же самое, то есть генерирующий случайный массив уникальных целых чисел из некоторого диапазона?