忍者ブログ
自己満足日記。 飽きっぽいので期待しないでください。
[205]  [204]  [203]  [202]  [201]  [200]  [199]  [198]  [197]  [196
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

作成していた習作のプラグインに分散処理にあたって、
当初利用していたOpenMPは必ず再頒布パッケージが必要になり、
こんな大したことないものを利用するために
一々ライブラリが必要だと言うのはとてもやりづらいので

動的にしかビルドできないOpenMPから
静的にビルド可能な内蔵の関数へと切り替える必要があり、
これらの間の構文の違いを吸収するためOpenMPで利用していたコードから、
これらの間で流用可能なコードに書き換えてみた。

OpenMPでのループの並列化は基本的にはこう。
#pragma omp parallel for
for(int x = 0; x<1000; x++){
 //特に構えることなく並列化できるコード
}


この場合、仮に4threadで処理するのなら

1thread目:0~249番のループ
2thread目:250~499番のループ
3thread目:500~749番のループ
4thread目:750~999番のループ

てな感じで分散して処理される。処理の順番はバラバラ。
schedule句によってこの分配は変えられる。

実は特にループの為の構文を使わず、
若干の書き換えで一般のparallel構文でほぼ同様に分散することもできる。
総カウント数をthread数で割って0~249までは1thread目が~、
などと事前に計算する必要はない。

#pragma omp parallel
for(int x = omp_get_thread_num(); x<1000; x += omp_get_num_threads()){
 //特に構えることなく並列化できるコード
}

omp_get_thread_num()
引数を取らず、並行領域内で自分が何thread目かを返す関数。

omp_get_num_threads()
引数を取らず、その並行領域の総thread数を返す関数。

この場合、上と同様に4threadで処理するのなら

1thread目:0,4, 8,12,16,20,24,...番のループ
2thread目:1,5, 9,13,17,21,25,...番のループ
3thread目:2,6,10,14,18,22,26,...番のループ
4thread目:3,7,11,15,19,23,27,...番のループ

という形で分散される。schedule(dynamic, 1)とほぼ同じ形になる。

そしてAviutlのvoid multi_thread_func関数においてほぼ同様の挙動になるように書き換えるとこうなる。

for(int x = thread_id; x < 1000; x += thread_num){
 //特に構えることなく並列化できるコード
}

わぁ簡単(ぱちぱち
thread_idとthread_numの説明は良いでしょう。
PR
Comment Form
Name
Title
Color
Mail
URL
Text
Password   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
カレンダー
03 2024/04 05
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
最新コメント
[03/13 まぶ]
[03/11 えぼ]
[10/31 きりん]
[10/19 たびパパ]
[10/17 zui]
アクセス解析
してますよ。
This template design was imitated from PukiWiki Skin "GS2" which designed by yuza.
© Gravity Co., Ltd. & Lee MyoungJin(studio DTDS). All rights reserved.
© 2008 GungHo Online Entertainment, Inc. All Right Reserved.
当コンテンツの再利用(再転載・配布など)は、禁止しています。
忍者ブログ [PR]