2016-12-29 3 views
1

これは簡単な質問ですが、私は答えを見つけることができませんでした。'array'タイプのクラスメンバーを使用

あるクラスメソッドが呼び出されたときにメモリがGPUで定期的に処理される大きなメモリブロックを管理するC++クラスが必要です。クラスのコンストラクタには配列のサイズが渡され、構築後には配列のサイズは変わりません。 parallel_for_eachを実行するメソッドは、必要でないときにプロセッササイクルやメモリを無駄にするべきではありません。

どうすればよいですか?

並行処理::配列をクラスメンバーとして作成することはできません。なぜなら、配列が作成される前の大きさを知る必要があるからです。 parallel_for_eachに指定する方法がわからないので、並行性::配列へのポインタであるメンバを持つことはできません(そして、それをコンストラクタなどで 'new'で割り当てる)ことはできません。

通常、GPUとホストの間で配列をコピーする必要はありませんが、何らかの理由でそれを行う必要がある場合は、定期的に行われない限り問題ありません。そうしないと、アレイのサイズに応じてプロセッササイクルとメモリが無駄になります。

ここに私が欲しいもののようなものの例があります。もちろん、parallel_for_eachでキャプチャされた参照/ポインタは間違っています。 (これは、構文がチェックされません):

class MyClass 
{ 
    int* myHostArrayPtr; 
    concurrency::array<int,1>* myGpuArrayPtr; 

    MyClass(int size) 
    { 
     myHostArrayPtr = new int(size); 

     memset(myHostArrayPtr,0,size * sizeof(int)); 

     myGpuArrayPtr = new concurrency::array<int,1>(size,myHostArrayPtr); 
    } 

    void ProcessInGpu() 
    { 
     parallel_for_each(
      myGpuArrayPtr->extent, 
      [&myGpuArrayPtr](index<1> i) restrict(amp) 
      { 
       myGpuArray[i]+=14; 
      } 
     ); 
    } 
}; 

答えて

0

私が思うに、あなたがここにテンプレートを必要とする:

template <std::size_t N> class MyClass { 
    concurrency::array<int,N> myGpuArray; 
    ... 
} 

int main() { 
    MyClass<10> someName; 
    ... 
} 
+0

テンプレートパラメータは一定でなければならないので、これはまだハードコードされた配列サイズです。 – Digiproc

0

OK、私はそれを考え出したと思います。 parallel_for_eachは、配列オブジェクトへの参照を受け取る関数に置かなければなりません。そして、parallel_for_eachへの参照によってそれらを渡すことができます。ウィットに:私が思うあなたが仕事の周りに上記の関数呼び出し(なし尖った-への変数の参照などを参照することができないことをC++欠点に周りの本当に仕事、ので

void MyClass::Process(concurrency::array<int,1>& myGpuArray){ 
    parallel_for_each(
     myGpuArray.extent, 
     [&myGpuArray](index<1> i) restrict(amp) 
     { 
      myGpuArray[i]+=14; 
     } 
    ); 
} 

これは面白いです?)。 (つまり、コピーコンストラクタを呼び出さずに)。

編集:

上記のとおりです。私はそれをベンチマークし、ローカルアレイを使用するコードと同じくらい速いです。また、私は呼び出しの中の参照へのポインタを変換することによってそれをテストし、それも機能しました。したがって、動的に割り当てられた配列で動作します。

関連する問題