![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
並列処理について。
画像imageの値が0より大きい場合に、managerを実行しますが、managerの計算時間が長いです。
そこで、4つのコアでpthreadにより、並列処理をさせたいんですが、
どのようにプログラムを書けばいいかすみませんが教えてください。
あるボクセルを計算中に、次のボクセルを計算するようなプログラム。。。
for (int z=0; z<32; z++){
for (int y=0; y<32; y++){
for (int x=0; x<32; x++){
if(image(x,y,z) > 0){
total += manager(x,y,z);
}
}
}
}
No.1ベストアンサー
- 回答日時:
念のために確認ですが、たとえばmanager(x,y,3)の計算結果がmanager(x,y,9)の計算に影響を与えるようなことはないのですよね?
影響する場合には仕事の分割が難しくなるので。
基本的な手順はこんな感じです。
1) メインスレッドは4つの子pthreadをpthread_createで起動します。それぞれのidを0~3とします。
2) 子pthreadはそれぞれ下記の計算を行います。total[]は大域変数という想定です。
for (int z=id*8; z<id*8+8; z++){
for (int y=0; y<32; y++){
for (int x=0; x<32; x++){
if(image(x,y,z) > 0){
total[id] += manager(x,y,z);
}
}
}
}
3) メインスレッドは全ての子pthreadが終了するのをpthread_joinで待ちます。
4) メインスレッドでtotal[0~3]の結果を合計します。
子スレッドのidを指定するにはpthread_createの第4引数を使って工夫すればいいでしょう。
子スレッドの計算結果もpthread_exitを使ってメインスレッドに返す方法がありますが、void*型だからといってうっかりローカル変数へのポインタを使ったりすると予期しないことが起きます(この点はpthread_createの第4引数も同じ)。
zの範囲を4つのスレッドに分割した例を示しましたが、扱うデータの形式によっては別の分け方をしたほうがキャッシュミスが減って速くなるかもしれないです。
ご返事ありがとうございます。
managerの結果は相互に影響しないので、上の方法でやってみます。
データの中身によっては、ある断面(z=10)しか値がない場合があるので
x,yの範囲に分割してみまーす。
No.2
- 回答日時:
どんな環境でやってますか?
OpenMP対応コンパイラ( VC++2005以降など)だとこんな書き方もできます
#pragma omp parallel for reduction(+:total)
for (int z=0; z<32; z++){
for (int y=0; y<32; y++){
for (int x=0; x<32; x++){
if(image(x,y,z) > 0){
total += manager(x,y,z);
}
}
}
}
VC++2005 Academic Editionを使用しているので、
残念ながらOpenMPには未対応です。
しかし、OpenMPに関する情報ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
intとlongは同じ?
-
C++で表を作成したいのです ...
-
C言語で簡単なパックマンゲーム...
-
再起呼び出しの回数をカウント...
-
【C#】SQL文の中に変数を埋め込...
-
プログラミングに関して
-
分数の足し算をさせるプログラ...
-
条件が多い場合
-
3のつく数と3の倍数を表示 C言語
-
再帰処理をループ処理に変換
-
関数と引数の関係とは?
-
最大の四角形を求めるプログラム
-
迷路の解を見つけるアルゴリズム
-
迷路を脱出する経路探索プログ...
-
ヒストグラム均等化処理プログラム
-
乱数で交互に偶数、奇数が、、、。
-
漸化式:nCrの計算(C言語)
-
乱数発生
-
マイナスからプラスへ転じた時...
-
信頼区間の1.96や1.65ってどこ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
おすすめ情報