3

Cプログラム内で並列実行を実装する可能性について質問があります。私のコードは次のようになります:

struct str {
   field;
   field2;
   struct name * ptrNext;
}

// something others

int main() {
    struct str *pHead = malloc((...)sizeof(struct str));
    struct str *ptr;
    // other.....
    /* Generation of dynamic list*/

    ptr=pHead;

    while(... ... ...) {
          someFunctionOnNode(ptr);
          ptr=ptr->ptrNext;
    }
}

プログラムの速度を上げ、プロセッサに複数のコアがあることを利用するために、関数の起動を並列化したいと思いますsomeFunctionOnNode

Cでこれを行う方法はありますか?

4

5 に答える 5

5

これを行う最も簡単な方法は、ほぼすべての最新の C および C++ コンパイラでサポートされている OpenMP ディレクティブを使用することです。十分に新しいもの (つまり、OpenMP 3.0 をサポートしている) の場合は、単純にタスクを使用できます。

#pragma omp parallel
{
    #pragma omp single
    while(... ... ...) {
        #pragma omp task
        someFunctionOnNode(ptr); // This function call becomes a task
        ptr=ptr->ptrNext;
    }
    #pragma omp taskwait
}

この単一のディレクティブは、1 つのスレッドのみがリストをたどってタスクを生成するようにするためのものですが、それ以外の場合はすべてのスレッドが実行するタスクを選択します。ディレクティブはtaskwait、すべてのタスクが完了するまで待機します。parallelリージョンの最後に暗黙的なバリア同期があるため、厳密には必要ありません。

ptrコンパイラが OpenMP 3.0 をサポートしていない場合は、フラットな配列にすべての可能な値を入れてから、それに対して並列 for ループを実行することで回避できます。

datatype *ptrs[NUM_PTRS]; // Or allocate with new
int i = 0;
while (... ... ...) {
    ptrs[i++] = ptr;
    ptr = ptr->ptrNext;
}

#omp parallel for
for (i = 0; i < NUM_PTRS; i++)
{
    someFunctionOnNode(ptrs[i]);
}

OpenMP サポートも有効にする必要がありますが、その方法はコンパイラ固有です。

于 2012-05-30T15:01:34.320 に答える
0

OpenMPは、クラスター MPI を使用している場合、プロセッサがメモリをシアリングする場合におそらく最適なソリューションです。OpenMP では、コードを並列実行するコンパイラにプラグマを与えるだけなので、既存のコードを簡単に適応させることができます。

于 2012-05-30T15:01:18.450 に答える
0

各関数を個別のスレッドで起動します。スレッド化 API は、開発しているシステムによって異なりますが、UNIX ライクな場合は、pthreads を確認してください。

https://computing.llnl.gov/tutorials/pthreads/

于 2012-05-30T14:47:51.423 に答える
0

はいあります。MPI フレームワークを確認してください。

于 2012-05-30T14:48:39.123 に答える
0

標準 C には並列処理機能がありません。最善の策は、プラットフォームに依存するマルチスレッド関数またはその他の移植性の高いマルチプロセッシング API を使用することです。

于 2012-05-30T14:49:28.450 に答える