Массив Init с уникальными случайными целыми числами с использованием OpenMP - PullRequest
0 голосов
/ 10 июня 2019

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

И если нет способа сделать это, есть ли другой параллельный алгоритм, делающий то же самое, то есть генерирующий случайный массив уникальных целых чисел из некоторого диапазона?

...