リンク リスト形式のデータを GPGPU に転送しようとしています。ノードの数と同じ数の転送を行う必要がありますか?それとも、それを行うためのより適切で高速な方法はありますか?
2 に答える
Thrust ライブラリを使用すると、イテレータ範囲からデバイス ベクターを生成できます。次のサイトでは、このケースの例を提供しています
#include <thrust/device_vector.h>
#include <thrust/copy.h>
#include <list>
#include <vector>
int main(void)
{
// create an STL list with 4 values
std::list<int> stl_list;
stl_list.push_back(10);
stl_list.push_back(20);
stl_list.push_back(30);
stl_list.push_back(40);
// initialize a device_vector with the list
thrust::device_vector<int> D(stl_list.begin(), stl_list.end());
// copy a device_vector into an STL vector
std::vector<int> stl_vector(D.size());
thrust::copy(D.begin(), D.end(), stl_vector.begin());
return 0;
}
https://github.com/thrust/thrust/wiki/クイックスタートガイド
「イテレータと静的ディスパッチ」というタイトルのセクションを見てください。
STL のアルゴリズム ライブラリで同様の操作を実行できます。
std::list<int> stl_list;
stl_list.push_back(10);
...
float *myarray = new float[stl_list.size()];
float *mydevicearray;
CUDA_SAFE_CALL(cudaMalloc(&mydevicearray, sizeof(float)*stl_list.size()));
std::copy(stl_list.begin(), stl_list.end(), myarray);
CUDA_SAFE_CALL(cudaMemcpy(myarray, mydevicearray, sizeof(float)*stl_list.size(), cudaMemcpyHostToDevice));
これらの 2 つの例では、メモリを CUDA デバイスにコピーするのはコストがかかり、リスト内の各要素に対して行うのは論理的ではないため、memcopy 操作を 1 回だけ行う必要があります。
リンクされたリストから配列 (GPU) にデータを転送する場合は、ノード内の値を配列 (GPU) に送信するだけです。シンプルなものです。cudaMalloc()
ノード数のサイズでご利用いただけます。
連結リストから連結リスト (GPU) にデータを転送しようとすると、ノードを作成してデータを転送するという多忙なプロセスになります。ノードの作成、ノードのリンクなど、さまざまな機能を呼び出すことができます。(リンクされたリストは並列よりも直列であるため、好ましくありません)。
最初のケースに行くことをお勧めします。シンプルで必要なのはデータ転送だけです。
データ構造については、 Thrustライブラリを試してください。