2

C++ AMP が提供する大規模な高速化を利用するために、アルゴリズムを変換しています。私がいる段階では、for ループを既知の parallel_for_each ループに入れています。

通常、これは簡単な作業ですが、最初に考えたよりも複雑に見えます。これは、反復ごとに 4 のステップを使用してインクリメントするネストされたループです。

for(int j = 0; j < height; j += 4, data += width * 4 * 4)
{
    for(int i = 0; i < width; i += 4)
    {

私が抱えている問題は、インデックスの使用です。これを parallel_for_each ループに適切に適合させる方法が見つからないようです。ランク 2 のインデックスを使用するのが最善の方法ですが、分岐を介して操作すると、パフォーマンスの向上に悪影響を及ぼします。

同様の投稿を見つけました: Controlling the index variables in C++ AMP。インデックス操作についても扱っていますが、インクリメントの側面は私の問題をカバーしていません。

よろしくお願いいたします。

フォースキャスト

4

1 に答える 1

0

タイルは、インデックス作成メカニズムとしてではなく、GPU 全体で作業を分割するためのメカニズムと考える必要があります。4x4 タイルに制限すると、パフォーマンスのボトルネックに陥る可能性が高いことがわかりました。

次のことしかできません。

auto compute_domain = concurrency::extent<2>(height / 4, width / 4);

parallel_for_each(accl_view, compute_domain, [=](index<2> idx) restrict(amp)
{
    int j = idx[0] * 4;
    int i = idx[1] * 4;

    // Your algorithm here...
}
于 2014-08-20T04:44:17.710 に答える