0

リンク リスト形式のデータを GPGPU に転送しようとしています。ノードの数と同じ数の転送を行う必要がありますか?それとも、それを行うためのより適切で高速な方法はありますか?

4

2 に答える 2

5

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 回だけ行う必要があります。

于 2012-09-19T13:48:07.273 に答える
0

リンクされたリストから配列 (GPU) にデータを転送する場合は、ノード内の値を配列 (GPU) に送信するだけです。シンプルなものです。cudaMalloc()ノード数のサイズでご利用いただけます。

連結リストから連結リスト (GPU) にデータを転送しようとすると、ノードを作成してデータを転送するという多忙なプロセスになります。ノードの作成、ノードのリンクなど、さまざまな機能を呼び出すことができます。(リンクされたリストは並列よりも直列であるため、好ましくありません)。

最初のケースに行くことをお勧めします。シンプルで必要なのはデータ転送だけです。

データ構造については、 Thrustライブラリを試してください。

于 2012-09-19T08:31:16.387 に答える