2016-10-06 13 views
0

次の例を考慮すると、OpenMPでは、buff1buff2に格納されているアドレスを決定する必要があります。ただし、buff1buff2に格納されているアドレスは、タスクを実行するスレッドのID(myid)に応じて決定されます。問題を解決するにはどうしたらいいですか?どのような解決策が評価されます。私は記憶を割り当てることができません。スレッドプライベートストレージへのOpenMPタスク依存性

mystruct* buff1; 
mystruct* buff2; 
#pragma omp task depend(in: data[0:1000]) depend(inout: buff1[0:0]) 
{ 
    int myid=omp_get_thread_num(); 
    buff1=buffers[myid]; 
    processA(data, buff1); 
} 
#pragma omp task depend(in: data[0:1000]) depend(inout: buff2[0:0]) 
{ 
    int myid=omp_get_thread_num(); 
    buff2=buffers[myid]; 
    processB(data, buff2); 
} 
#pragma omp task depend(in: data[0:1000]) depend(inout: buff1[0:0]) depend(inout: buff2[0:0]) 
{ 
    processC(data, buff1, buff2); 
} 

答えて

0

タスクの作成時にタスクの依存関係が登録されます。タスクの実行を開始する前にそれらを実行する必要があるので、あなたが求めていることは不可能です。

buff1buff2の依存関係を、それらが指し示す内容ではなく直接定義することを検討しましたか?

mystruct* buff1; 
mystruct* buff2; 
#pragma omp task depend(in: data[0:1000]) depend(inout: buff1) shared(buff1) 
{ 
    int myid=omp_get_thread_num(); 
    buff1=buffers[myid]; 
    processA(data, buff1); 
} 
#pragma omp task depend(in: data[0:1000]) depend(inout: buff2) shared(buff2) 
{ 
    int myid=omp_get_thread_num(); 
    buff2=buffers[myid]; 
    processB(data, buff2); 
} 
#pragma omp task depend(in: data[0:1000]) depend(inout: buff1, buff2) // shared(buff1, buff2) ??? 
{ 
    processC(data, buff1, buff2); 
} 

これは、これら2つの句の意味の違いに注意することが重要です:depend(inout: buff1)depend(inout: buff1[0:0])。最初のものは&buff1以上の依存関係を定義し、2番目のものは&buff1[0] = &(*(buff1 + 0)) = buff1以上の依存関係を定義します。一般に、最初のタスクは、タスクがポインタ自体の値を生成しているときに使用されます(通常はshared句と一緒に使用されます)。一方、タスクがそのポインタによって指されたデータを変更しているときに使用されます。

最後に、buff1buff2変数のデータシャーリングを指定しませんでした。これらの変数に対するタスクの変更を外部から見る必要がある場合は、これらの変数に共有として注釈を付ける必要があります。

関連する問題