Следующий простой сценарий произвести случайное число в параллельномпоточно-генератор случайных чисел с OpenMP
#include <random>
#include <iostream>
#include <omp.h>
int main(int argc, char *argv[])
{
// Three integers are expected from the command line.
// The first integer is a random seed
// The second integer is the number of threads.
// The third integer indicates the number of random numbers to produce
// Read the seed and create the random number generator and the random distribution
int seed = std::stoi(argv[1]);
std::mt19937 mt(seed);
std::uniform_real_distribution<float> dist(0, 100);
// Read the number of threads and set it.
int nbThreads = std::stoi(argv[2]);
omp_set_num_threads(nbThreads);
// Number of random number for demonstration
int n = std::stoi(argv[3]);
// Will store the random number to print them conveniently
std::vector<float> store(n);
// produce 'n' random numbers
#pragma omp parallel for
for (int i = 0 ; i < n ; ++i)
{
store[i] = dist(mt);
}
// print the random numbers
for (auto& rnd : store)
{
std::cout << rnd << std::endl;
}
return 0;
}
Приведенный выше скрипт детерминированным при использовании одного потока
./test 3 1 2
55.0798
7.07249
./test 3 1 2
55.0798
7.07249
./test 7 1 2
7.63083
22.7339
./test 7 1 2
7.63083
22.7339
Однако, это частично стохастическим и содержать корреляцию между потоками (что может быть довольно большой проблемой) при использовании более одной нити
./test 3 2 2
43.1925
43.1925
./test 3 2 2
55.0798
7.07249
./test 7 2 2
22.7339
7.63083
./test 7 2 2
7.63083
7.63083
Я понимаю, почему мой код не является потокобезопасным, но я не понимаю, как сделать его потокобезопасным. Возможно ли, что имеет детерминированный выход независимо от количества потоков?
Цель состоит в том, что ./test 87 1 200
дают тот же результат, как ./test 87 3 200
(то есть число потоков не будет влиять на объект store
). Если это невозможно, то целью является то, что ./test 87 3 200
дает тот же результат, что и ./test 87 3 200
.
Можете ли вы уточнить, что вы хотите сделать? Очевидно, что PRNG, который производит последовательность выходов, может воспроизводить только эти выходы последовательно. Что ты хочешь? –
@DavidSchwartz Я редактировал сообщение, надеясь сделать его более понятным. Я пытаюсь сделать детерминированный процесс, который принимает случайное семя и производит случайное число многопоточным способом. Является ли это возможным? Я не уверен, что мой комментарий просто помог вам понять. Не могли бы вы уточнить, что неясно? –
Каковы темы, которые будут делать именно? Чтобы результат был детерминированным, должен быть первый результат, который идет в какое-то конкретное место. И тогда, и только тогда, может быть второй результат. Правильно? Кажется, вы просите, чтобы они делали вещи в определенной последовательности (один, затем следующий и т. Д.), Но также делали их многопоточно. –