0

以下にサンプルの作業コードがあります ( parallel_for using Parallel Pattern Library ( ppl ) )。ここでの主な問題は、sqr < concurrent_vector > 格納された値が実行ごとに変化することですが、そうであってはなりません!

ランダム アクセスに < concurrent_vector > を使用しましたが、なぜ機能しないのですか?

#include <iostream>
#include <ppl.h>
#include <concurrent_vector.h>

using namespace std;
using namespace concurrency;

const int a = 10, b = 30;

critical_section cs;

int main() {

    concurrent_vector< int > labels( a * b );

    concurrent_vector< int > sqr( 5 );

    // filling label vector
    for ( int y = 0; y < b; y++ ) {
        for ( int x = 0; x < a; x++ ) {

            if( x<2 && y>3 )
                labels[ a * y + x ] = 1;
            else if( x<30 && y<5 )
                labels[ a * y + x ] = 2;
            else if( x>5 && y>10 )
                labels[ a * y + x ] = 3;
            else if( x>2 && y>20 )
                labels[ a * y + x ] = 4;
        }
    }

    // printing
    for ( int y = 0; y < b; y++ ) {
        for ( int x = 0; x < a; x++ ) {

            cout << labels[ a * y + x ] << ", ";
        }
        cout << endl;
    }

    parallel_for ( 0, b, [ & ]( int y ) {
        for ( int x = 0; x < a; x++ ) {

            //cs.lock();  // when i used it's working but slow
            int i = labels[ a * y + x ];
            //cs.unlock();

            if ( i < 0 ) continue;

            sqr[ i ] ++;
        }
    } );

    for( int i=0; i<5; i++ )
        cout << sqr[i] << ", ";
    cout << "" << endl;

    system ("pause");

    return 0;
}
4

2 に答える 2

2

並行性に関連する並行ベクターの機能を使用していません。実際、違いなしで標準ベクトルに置き換えることができます...どうやら、カーネルの各実行で i の値が重複しています。ベクトルの同じ要素への同時書き込みが同期されるという保証はまったくありません。したがって、ランダムな結果が得られます。これは、非アトミック書き込みでのデータ競合の結果です。

于 2013-10-12T07:45:45.657 に答える
-1

メソッドを使用task_group::waitする方が高速で (毎回ロック/ロック解除する必要がないため)、期待どおりに動作する可能性があります。

このメソッドは、別のタスク グループのタスクが作業を完了するまで、現在のタスクをブロックします。

MSDN:並列タスクを参照してください。

更新:いくつかのタイミング テストを実行しましたが、これは解決策ではないようです (デュアル コアの大きなデータ入力で両方とも失敗することに加えて)。これは、Intel の TBB のように「concurrent_vector の design」のバグである可能性があります - tbb::concurrent_vector が間違ったサイズを返す

于 2013-02-23T15:11:43.340 に答える