private 変数の初期化について | 並列化フォーラム | フォーラム

iSUS に投稿されている記事の内容や、IA プラットフォーム上でのソフトウェア開発に関するトピックを開発者同士でディスカッションできる場としてフォーラムを公開しています。

運営ルールはフォーラムの利用案内をご覧ください。
フォーラムの使い方はこちら

 
フォーラムに投稿するにはログインが必要ですログイン

private 変数の初期化について

メンバー投稿

6:53 PM
2013年9月25日


suke326

投稿数 2

1

変数xを分割された各スレッドで一度つづだけ初期化したいです。
そこで以下のようなソースを書きました。
しかし、x=の初期化は本来omp_get_max_threads()回しか行われないが、以下のソースではcount回if文が評価されます。

int x;
int count = 10;

#pragma omp parallel for private(x)
for(int i = 0; i < count; i++){
if(i % (count / omp_get_max_threads()) == 0){
x = (omp_get_thread_num() % 2 == 0) ? 0 : 1;
}

TRACE("%d: %d\n", omp_get_thread_num(), x);
}

そこで、以下のようなソースを考えたのですが、このような書き換えをしない限り所望のソースを記述することはできないでしょうか?

int threads = omp_get_max_threads();

#pragma omp parallel for
for(int num = 0; num < threads; num++){
int count = 10;
int step = count / threads;

int rem = 0;
if(num == threads – 1){
rem = count % threads;
}

int x = (num % 2 == 0) ? 0 : 1;

for(int i = step * num; i < step * (num + 1) + rem; i++){
TRACE("%d:%d\n", omp_get_thread_num(), x);
}
}

言葉足らずなところがあるかもしれませんがご教示いただけますようお願いいたします。

5:21 PM
2013年9月27日


iSUS編集部 – 中村

投稿数 13

2

suke326 様

ご質問について、複合ワークシェア構文 parallel for の代わりに、並列実行領域の指定 parallel とワークシェア構文 for に分けることで、スレッドごとに1回実行する領域を作ることができます。
以下のコードでは x の代入はスレッドごとに1回、for ループに関しては各スレッドにループ回数/スレッド数の処理が分配されます。

int x;
int count = 10;

#pragma omp parallel private(x)
{
x = (omp_get_thread_num() % 2 == 0) ? 0 : 1;

#pragma omp for
for(int i=0; i<count; i++){
TRACE("%d: %d\n", omp_get_thread_num(), x);
}

} // omp end parallel

以下のドキュメントもご参考になるかと思います。
http://jp.xlsoft.com/documents…..6J-001.pdf
Fortran ユーザの方はこちら
http://jp.xlsoft.com/documents…..7J-001.pdf

5:43 PM
2013年9月27日


suke326

投稿数 2

3

iSUS編集部
中村 様

回答ありがとうございます。
またドキュメント有難うございます。

解決いたしました。

以上です。