2017-01-30 19 views
1

igraph_rng_default()がスレッドセーフな乱数ジェネレータを提供するかどうかを知りたいのですが、その場合はどうすればいいですか?さらに、すべてのスレッドでigraph_sbm_gameを呼び出すと、これらのグラフの生成はスレッドセーフですか?Igraph乱数ジェネレータin c


編集: より明確にするために、これは私が私のプログラムに書いたものです:igraph_sbm_gameが選ばれたRNGに基づいてランダムグラフを生成するので

#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乱数ジェネレータでは、スレッドで安全に乱数を取得できますか?私の疑問は、igraph_sbm_game()関数がシードを必要としないことと、igraphによってどの乱数ジェネレータが使用されているのかを見つけることができないという事実から来ています...

+0

私はあなたが質問を詳しく述べるべきだと思います。スレッドセーフ乱数ジェネレータではどういう意味ですか?あなたはそれを試していくつかの問題を発見しましたか?また[ask]も参照してください。 –

+0

スレッドセーフであっても、スレッドごとに別々のRNGを使用するほうがよいでしょう。これは、デフォルトRNGの競合が発生しないためです。 –

+0

別のスレッドで別々のrngを呼び出すにはどうすればよいですか? –

答えて

1

igraphはスレッドとして設計されていません-safe - スレッド間で共有される特定のデータ構造(igraphが関数の途中で割り当てるポインタのグローバルクリーンアップスタックなど)があるため、同時に2つのigraph関数を呼び出すことは安全ではありません異なるスレッド。これはおそらくあなたの元の質問に答えます:いいえ、乱数ジェネレータはスレッドセーフでもありません。

./configureスクリプト(--enable-tls)には、グローバルデータ構造をスレッドローカルストレージに移動する実験スイッチがあります(コンパイラがサポートしている場合)。これにより、同じグラフを別のスレッドから操作しない限り(またはグラフへのアクセスを調整するためにロックを使用する)igraphをスレッドセーフにする可能性があります。しかし、これは完全にテストされていないので、慎重に進んでください。

関連する問題