2

私は UPC でプログラミングしており、2 つのスレッド間で配列を共有しています。各スレッドには、これらの共有領域へのプライベート ポインターがあります。

#define SIZE 10000
#define HALFSIZE (SIZE/2)

shared [ HALFSIZE ] int table [ SIZE ]; /* all areas */
shared [ HALFSIZE ] int *first_area_pt; /* points to first thread area */
shared [ HALFSIZE ] int *second_area_pt; /* points to second thread area */

今は 2 つではなく、N 個のスレッド、N 個の領域、および N 個のポインターが必要です。したがって、これらのポインターの配列が必要です。

shared [ HALFSIZE ] int *first_area_pt;
shared [ HALFSIZE ] int *second_area_pt;

どのように定義すればよいですか?

4

2 に答える 2

1

静的スレッド コンパイル環境を使用していると仮定すると、配列を宣言するより簡潔な方法は次のようになります。

#define SIZE 10000

shared [*] int table [ SIZE ]; /* data automatically blocked across THREADS */

shared [1] int *base = (shared [1] int *)&table;

次に、循環ベース ポインターを使用して、次のような式でスレッド X との親和性を持つデータを参照する共有へのポインターを作成できます。

  shared [] int *threadXdata = (shared [] int *)(base+X);

このアプローチでは、THREADS ポインターの配列のストレージをインスタンス化する必要はありません。ただし、本当に必要な場合は、次のように宣言して初期化できます。

  shared [] int *threadptr[THREADS];
  for (int i=0; i < THREADS; i++) threadptr[i] = (shared [] int *)(base+i);
  ...
  threadptr[4][10] = 42; /* example access to element 10 on thread 4*/

ここで、threadptr は、各スレッドのデータへの参照のディレクトリとして機能するポインターのローカル配列です。

上記のすべては、単一スレッドへの親和性を持つ要素にアクセスするために無期限にブロックされた共有へのポインターを使用することに注意してください。これは、各ブロックが論理的に 1 つの連続したデータのチャンクであり、スレッド間でラッピングされていないためです。

于 2014-04-13T07:25:39.037 に答える
0

あなたが使用している表記法は非標準であるため ( UPC - Unified Parallel C - 仕様に従っていると私は収集していますが)、必要なものを推測することしかできません。(いつ) 異常なため、何を使用しているかを強調すると役立ちます。

shared [ N ]これは、表記法の 1 つの可能な解釈の下では、表面的にもっともらしいように見えます。

#define SIZE 10000
#define NUMTHREADS 25
#define FRACSIZE (SIZE/NUMTHREADS)

shared [ FRACSIZE ] int table[SIZE];
shared [ 1 ]        int *area_ptr[NUMTHREADS];
于 2012-01-01T22:13:13.410 に答える