0

私は以下のようなacプログラムを持っています:

int a[10];
int b;

for(int i = 0; i < 10; i++)

     function1(a[i]);
function1(b);

ここで、関数function1()のこれら11回の呼び出しすべてを並列化したいと思います。openmpを使用してこれを行うにはどうすればよいですか?

私が試してみました

#pragma omp parallel sections
{
#pragma omp section
#pragmal omp parallel for
for(int i = 0; i < 10; i++)
     function1(a[i]);
#pragma omp section
function1(b);
}

しかし、上記のコードは機能していないようです。編集:function1(b)を別の関数、つまりfunction2(b)として読んでください。

4

2 に答える 2

1

OpemMP に依存しない簡単な方法は、配列に追加bすることです。 このようにして、並列化する単一のループができます。 11 個のint を長くして、最後の値に の値を入れます。a

ab

より一般的な場合 ( のメンバーがa整数ではなく、より大きなものであると仮定)、function1ポインターを取得するように変更する必要がある場合があります。次に、11 個のポインターからなる別の配列を作成します。のセルを指すように 10 を設定しa、最後を に設定しbます。

さらに一般的なケースでは、呼び出される関数bは別のものです (完全に異なるパラメータを持つ可能性があります)。この場合でも、1 つのループを使用できます。

for (i=0; i<11; i++) {
    if (i<10) {
        function1(a[i]);
    } else {
        function2(b);
    }
}
于 2012-05-13T14:16:37.650 に答える
1

最も簡単な方法は、parallel forプラグマを使用することです。

#pragma omp parallel for
for(int i = 0; i < 10; i++)
    function1(a[i]);

OMP サポートを有効にするには、コンパイラの適切なスイッチをオンにする必要があることに注意してください。たとえば、GCCでは、そのスイッチは-fopenmp

于 2012-05-13T14:14:42.383 に答える