
並列処理について。
画像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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- C言語・C++・C# 変数のスコープ 5 2023/05/27 17:50
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# numpyスライス機能を使った数値計算 2 2023/05/08 16:01
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# このプログラミングの問題を教えて欲しいです。 キーボードから整数kを入力し、kが配列aの中に何個存在 2 2022/12/19 22:50
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Visual C++ フレームを中央に表...
-
C++ bmp 透過処理
-
C言語プログラミング 漸化式に...
-
ヒストグラム均等化処理プログラム
-
C言語の関数について。
-
16bitで乱数を生成する方法
-
nCrの計算
-
並列処理プログラム
-
カレンダークラス
-
シェアウェアの作り方
-
C言語でDOS画面のプログラム(...
-
returnの使い方
-
DXライブラリによるパズルゲー...
-
偶数パリティ
-
whileとifを使い偶数を出すには
-
Pythonで入力した値以外の最大...
-
C言語で簡単なパックマンゲーム...
-
direct3dで当たり判定
-
再起呼び出しの回数をカウント...
-
| (or) を使った関数の引数の作...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
2の補数を計算するプログラム
-
intとlongは同じ?
-
条件が多い場合
-
再起呼び出しの回数をカウント...
-
argvのNULLチェック
-
C言語でDOS画面のプログラム(...
-
カードシャッフルのブログラム...
-
c++ TCHARで文字化け
-
複数の共有メモリの作成
-
C++ Debug Errorについて教えて
-
C++ bmp 透過処理
-
関数とビット列
-
OpenCVによる4値化について
-
コマンドプロンプトのウィンド...
-
ヌメロンのプログラム
-
for 分についてです
-
DXライブラリとC言語 fwrite関...
-
16bitで乱数を生成する方法
-
プログラミングに関して
-
C++で表を作成したいのです ...
おすすめ情報