2016-12-06 8 views
0

私の目標は、あるタスクを達成するpthreadsを使ってマルチスレッドアプリケーションを作成することです。タスクとpthreads自体が正しく機能しているので、数百行のコードを画面に表示せず、この重要なビットだけを表示します。コードをテストする必要がある場合は謝罪し、これは困難になります。2次元配列のループ境界をスレッドごとに分割する方法

私は残念ながら私はこの図で行うことを意図していて、スレッドによってブロック単位で仕事をするために2次元配列を分割する方法を見つけ出すことはできません。テストの際

enter image description here

for(int i=(t_id%x)*(height/x); i<(t_id%x + 1)*(height/x); i++){ 
    for(int j=(t_id%x)*(length/x); j<(t_id%x + 1)*(length/x); j++){ 
     //some work is done 
    } 
} 
//t_id -> thread id 
//x -> 2^x = number of threads, so in this ex, x=4 
//i -> y axis, j -> x-axis 
//height -> bound on y-axis of array 
//length -> bound on x-axis of array 

をし、この解決策は、すべてのスレッドが対角線に沿って配置されるという欠点を有することは明らかである。私はこれを回避するソリューションを構築する方法を考え出すことはできません。私はこの問題を解決する方法について何か提案していただければ幸いです。

+0

から始まる私は[作業パーティション](HTTPSを使用したいW/M * (J + 1)H/N * (I + 1)W/M * J範囲のデータを扱うことになる行のセルを扱うスレッドより://blogs.oracle.com/d/entry/partitioning_work_over_multiple_threads)を参考にしてください。私はこれを使ってrow_start、row_end、col_start、col_end変数を作成します。最後のセクションでも境界条件が処理されます! その後、forループを反復処理するときは、row_startからrow_endまで1つずつ増やして、内部ループは同じ列を繰り返します。 – KosherBacon

答えて

1

グリッドをN行とM列に分割する必要があるとします。 Iおよび列Jは、I及びJは0

+0

ご協力いただきありがとうございます。だから、私は行と列を区別するために、私の問題は、スレッドID(この例では0-15)をI、J列マッピングに関連付ける方法だと思います。列が(t_id%num_threads)、列が(t_id/num_threads)になることを提案することは合理的ですか?私はこれがうまくいくかどうかを知ることができますが、私の元々の解決策についても考えていました。 –

+0

'num_threads = N * M'です。したがって、 '0 <= I GMichael

関連する問題