4

大規模な並列コンピューティングを必要とするプロジェクトに取り組んでいます。ただし、トリッキーな問題は、プロジェクトに次のようなネストされたループが含まれていることです。

for(int i=0; i<19; ++i){
    for(int j=0; j<57; ++j){
        //the computing section
    }
}

最高のゲインを達成するには、これら 2 つのレベルのループを並列化する必要があります。このような:

parallel_for_each{
    parallel_for_each{
        //computing section
    }
}

テストしたところ、AMP はネストされた for ループをサポートしていないことがわかりました。誰でもこの問題について何か考えがありますか? ありがとう

4

2 に答える 2

4

@High Performance Mark が提案するように、2 つのループを 1 つに折りたたむことができます。ただし、C++ AMP では および で 2 次元および3 次元extentの がサポートされているため、これを行う必要はありません。を多次元インデックスとして使用できます。arrayarray_viewindex

array<float, 2> x(19,57);
parallel_for_each(x.extent, [=](index<2> idx) restrict(amp)
{
    x[idx] = func(x[idx]);
});

float func(const float v) restrict(amp) { return v * v; }

idx以下を使用して、個々のサブインデックスにアクセスできます。

int row = idx[0]; 
int col = idx[1];

によって実行される作業の量も考慮する必要がありcomputing sectionます。比較的小さい場合は、各スレッドに配列の複数の要素を処理させたい場合がありますx

次の記事も読む価値があります。CPU と同様に、ループがメモリに効率的にアクセスしない場合、パフォーマンスに大きな影響を与える可能性があるためです。C++ AMP では配列は行優先

于 2014-03-06T21:27:31.070 に答える
0

ループを折りたたむ:

for(int ij=0; ij<19*57; ++ij){
        //if required extract i and j from ij
        //the computing section
    }
}
于 2014-03-06T09:11:44.367 に答える