2

私はC++で次のループを持っています

dword result = 0;
for ( int i = 0; i < 16; i++ ) {
    result |= ( value[i] << (unsigned int)( i << 1 ) );
}

そして、それをアンプで並列化したいと思います。上記の実際の非並列バージョンよりも遅くなる可能性があることはわかっていますが、AMPについてもっと学ぶためにそれを実行したいと思います。

私のアイデアは、値の配列を並列にループすることでした。

ここに画像の説明を入力してください

そして、新しい配列にnewarray[0] = value[0] << (unsigned int)(0 << 1 )newarray[1] = value[1] << (unsigned int)(1 << 1 )などを入力します。次に、配列内の値をツリー構造で並列にORします(画像を参照)。

私はこのアイデアをいくつかの単純なc++ampコードに入れようとしましたが、成功しなかったので、助けていただければ幸いです。

ご検討のほどよろしくお願い申し上げます。お返事をお待ちしております。

4

1 に答える 1

0

次のコードは、必要と思われるものの一部です。このコードは、入力として多数の要素を取り、CPU でベクトルを準備してから、GPU でビット シフト操作を並列に実行します。次に、その要素を使用して最終結果を保存しているため、av[elements] を 0 に戻します。大雑把ですが、AMP は GPU で処理できるデータ型がかなり制限されているため、既存の配列の余分な要素を使用するだけです。ビット シフトが完了したら、ビットごとの OR 関数に対してそれぞれ別の並列処理を行います。これは GPU でも発生しますが、すべての操作が av[elements] 要素と正確に一致する配列の任意の要素を論理和演算するため、ボトルネックが発生するため、満足のいくものではありません。ツリー構造により、この部分がより速く実行されます。しかし、その部分を簡単に行う方法を理解できませんでした。現状では、このプログラムはかなり古いコンピューターで数秒で 1 億要素を処理できます。コード内のベスト プラクティス違反について事前にお詫び申し上げます。私も初心者です。コードは次のとおりです。

#include <conio.h>
#include <amp.h>
#include <iostream>

using namespace concurrency;
using namespace std;

unsigned int doParallel(unsigned int);

unsigned int elements;

void main()
{
    int ch=NULL;
    cout<<"\nHow many elements to populate: ";
    cin>>elements;
    cout<<"The result is: "<<doParallel(elements);
    cout<<"\nPress 'X' to exit.";
    do
    {
        ch=_getch();
    } while (ch!='X' && ch!='x');
    exit(0);
}

unsigned int doParallel(unsigned int elements)
{
    vector<unsigned int> v(elements+1);

    for (unsigned int i = 0; i<elements+1;i++)
        {
            v[i]=i;
        }
    array_view<unsigned int,1> av(elements+1,v);

    parallel_for_each(av.extent,[=](index<1> idx)
        restrict(amp)
        {
            av[idx] = static_cast<unsigned int>(av[idx])<<1;
        });
    av[elements]=0;
    parallel_for_each(av.extent,[=](index<1> idx)
    restrict(amp)
    {
        av[elements] |= static_cast<unsigned int>(av[idx]);
    });

    return av[elements];
}
于 2013-10-21T20:12:19.647 に答える