2012-02-21 7 views
7

最近私は推力をたくさん使っています。私は推力を使用するためには、常にCPUのメモリからGPUのメモリにデータをコピーする必要があることに気づいた。
はのは、次の例を見てみましょう:推力を使用してCPUメモリからGPUにコピーする方が優れていますか?

int foo(int *foo) 
{ 
    host_vector<int> m(foo, foo+ 100000); 
    device_vector<int> s = m; 
} 

私はhost_vectorコンストラクタがどのように機能するかをかなりよく分からないが、私は二回、*fooから来て、最初のデータをコピーしてるように思える - host_vectorときに一度初期化され、別の時刻にdevice_vectorが初期化されます。中間のデータコピーを作成せずに、CPUからGPUにコピーするより良い方法はありますか?私はラッパーとしてdevice_ptrを使用することができますが、それでも私の問題は解決しないことを知っています。
ありがとう!

答えて

14

device_vectorのコンストラクタの1つは、2つのイテレータで指定された範囲の要素をとります。 CUDAメモリへのあなたの生のポインタポイント場合

void my_function_taking_host_ptr(int *raw_ptr, size_t n) 
{ 
    // device_vector assumes raw_ptrs point to system memory 
    thrust::device_vector<int> vec(raw_ptr, raw_ptr + n); 

    ... 
} 

device_ptrを導入:それはあなたが直接device_vectorを構築し、一時的なhost_vectorを避けることができますので、あなたの例では、生のポインタを理解することは十分にスマートだ

void my_function_taking_cuda_ptr(int *raw_ptr, size_t n) 
{ 
    // wrap raw_ptr before passing to device_vector 
    thrust::device_ptr<int> d_ptr(raw_ptr); 

    thrust::device_vector<int> vec(d_ptr, d_ptr + n); 

    ... 
} 

device_ptrを使用しても、ストレージは割り当てられません。これは型システム内のポインタの位置をエンコードするだけです。

+0

引数size_t nはベクトルの要素数を指定します。size_t型名には含めないでください。size_tは通常、データ長をバイト単位で指定します。 – TripleS