0

私は、openmp が while ループをサポートしていないことを発見しました (または、少なくともあまり好きではありません)。また、' != ' 演算子も好きではありません。

私はこのビットのコードを持っています。

int count = 1;
#pragma omp parallel for
    while ( fgets(buff, BUFF_SIZE, f) != NULL )
    {
        len = strlen(buff);
        int sequence_counter = segment_read(buff,len,count);
        if (sequence_counter == 1)
        {
            count_of_reads++;
            printf("\n Total No. of reads: %d \n",count_of_reads);
        }
    count++;
    }

これを管理する方法についての手がかりはありますか?パイプラインを使用できるどこか (stackoverflow に関する別の投稿が含まれています) を読みました。それは何ですか ?そしてそれを実装する方法は?

4

3 に答える 3

4

OpenMP で「並列 while」を実装する 1 つの方法は、タスクを作成する while ループを使用することです。一般的なスケッチは次のとおりです。

void foo() {
    while( Foo* f = get_next_thing() ) {
#pragma omp task firstprivate(f)
        bar(f);
    }
#pragma omp taskwait
}

fgets をループする特定のケースでは、fgets は本質的にシーケンシャル セマンティクスを持っている (「次の」行を取得する) ため、タスクを起動する前に呼び出す必要があることに注意してください。また、各タスクが fgets によって返されたデータの独自のコピーを操作することも重要です。これにより、fgets の呼び出しによって、前のタスクによって操作されているバッファーが上書きされなくなります。

于 2013-05-29T17:31:36.887 に答える