0

スレッドを使用してパーティション化された配列から数値を加算するプログラムを C で作成しています。このプログラムは、いくつかのあいまいなコマンド ライン引数を使用して、使用するパーティションの数を決定します。

これは、私のブリーフから苦労している部分のコピーです。

    Divide the array into 2**n partitions (n is another command-line argument)   and create 
 one thread to do simple sum of all values stored in one partition   of the array. Each 
thread can calculate which locations of the array it should   search given the thread index
 (0,1, … 2**n-1). For example, if n=1 and the   array is size 512, then thread 0 should sum
 array locations [0,255] and   thread 1 should search array locations [256-511].  Each 
thread should store   the partial sum it produces in a global array.  Note that since the 
threads do   not share any data, they do not need to be synchronized, however you do   need
 to wait until the last thread completes processing before continuing on   to the next 
stage.

配列を分割する方法と、このタスクにスレッドが必要な理由はまったくわかりませんが、それが私の要件の一部であるため、それらを使用する必要があります。誰かが、パーティショニングとスレッドの理由についてもう少し明確に説明するのを助けることができれば、私は最も感謝しています。私はすでに配列を作成し、乱数で埋めました。

4

3 に答える 3

2

クラスは並列処理である可能性があり、この割り当てにより、2^n スレッドで特定の配列に対して並列加算を行うことができます。

于 2012-12-04T05:39:28.373 に答える
1

パーティショニングは論理的です。アレイを物理的に変更または分割する必要はありません。

各ワーカー スレッドに 0 から 2**n までの番号を付けます。

N size_t= 2**n とsize_tする M = 配列の長さ a = 数値の配列とする

スレッド 0: a[1*M/N] までの a[0*M/N] の合計を計算しますが、a[1*M/N] は含みません

スレッド 1: a[2*M/N] までの a[1*M/N] の合計を計算しますが、a[2*M/N] は含みません。

スレッド j: a[(j+1)*M/N] までの a[j*M/N] の合計を計算しますが、a[(j+1)*M/N] は含みません

最後のスレッド (j=N-1): a[j*M/N] から a[M] までの合計を計算しますが、a[M] は含みません。

すべてのスレッドが (の異なる部分) にa同時にアクセスします。

注: M/N は (意図的に) 整数除算を使用することに注意してください。

于 2012-12-04T08:48:35.493 に答える
1

アイデアは、一度に問題に取り組む複数のコアを持つことができるということです。スレッド化されたプログラミングを教えるために考案されたものであることは明らかですが、必要な数のスレッドを起動し、正しい開始点と処理するインデックスの量でスレッドをパラメーター化する必要があります。

メインスレッドは、それらが完了するのを待ってから、それぞれの部分合計を追加する必要があります。

于 2012-12-04T06:09:20.737 に答える