2017-01-30 7 views
1

Мне было интересно, что igraph_rng_default() предоставляет генератор случайных чисел с потоком или нет, и если это так, то какой rng я должен использовать? Кроме того, если вы вызываете igraph_sbm_game в каждом потоке, генерация этих графов является потокобезопасной?Генератор случайных чисел Igraph в c


Edit: быть более ясным, это то, что я написал в своей программе:

#define N 2048 
    #define R 16 
    #define rngseed 1763984 
int main(void) 
{ 
    igraph_rng_seed(igraph_rng_default(), rngseed); 
#pragma omp parallel shared(some_shared_variables) private(some_private_variables) 
{ 
    igraph_matrix_t pref_matrix;  
    igraph_matrix_init(&pref_matrix, R, R); 
    igraph_vector_int_t block_sizes; 
    /*SBM initialization*/ 
    igraph_vector_int_init(&block_sizes, R); 
    ... 
    ... 
    #pragma omp for ordered schedule(static,1)//ordered schedule(static,1) per risultati in ordine #pragma omp ordered per stampare in ordine  
    for(q1=0;q1<100;q1++) 
    { 
     igraph graph; 
     igraph_sbm_game(&graph, N, &pref_matrix, &block_sizes, IGRAPH_DIRECTED, IGRAPH_NO_LOOPS); 
     .... 
    } 
    } 

Мой вопрос, поскольку igraph_sbm_game генерирует случайный граф на основе выбранного ГСЧ, это случайность гарантированно быть потокобезопасным? Другими словами, с генератором случайных чисел igraph по умолчанию, я получаю случайные числа в потоковом безопасном режиме? Мое сомнение возникает как из-за того, что функция igraph_sbm_game() не нуждается в семени, а в том, что я не могу найти, какой генератор случайных чисел используется igraph ...

+0

Я думаю, вам следует разработать вопрос. Что вы имеете в виду с генератором случайных чисел с потоком? Вы пробовали его и нашли какую-то проблему? См. Также [ask]. –

+0

Даже если он потокобезопасен, вероятно, лучше использовать отдельный RNG для каждого потока, потому что тогда нет никаких шансов на разглашение стандартного RNG. –

+0

Как я могу назвать отдельные строки в разных потоках? –

ответ

1

igraph не предназначен для потоковой передачи -safe - существуют определенные структуры данных (например, глобальный «очищающий» стек для указателей, которые igraph выделяет в ходе функции), которые разделяются между потоками, поэтому небезопасно одновременно вызывать две функции igraph из разные потоки. Вероятно, это отвечает на ваш первоначальный вопрос: нет, генератор случайных чисел не является поточно-безопасным.

В своем сценарии ./configure (--enable-tls) имеется экспериментальный переключатель, который перемещает глобальные структуры данных в поточно-локальное хранилище, если компилятор поддерживает его. У этого есть потенциал сделать igraph потокобезопасным, пока вы не манипулируете тем же графиком из разных тем (или вы используете блокировку для координации доступа к графику). Однако это не было тщательно проверено, поэтому продолжайте внимательно.