4

私は推力ライブラリを使用するのが初めてです。グローバル 2D 配列を使用する CUDA C コードがあります。コードでカーネル関数を使用して初期化しています。

thrust::device_vector2D 配列を使用するかthrust::fill、初期化して埋めることができるかどうかを知る必要があります。

例えば:

// initialize 1D array with ten numbers in a device_vector 
    thrust::device_vector<int> D(10);

あげてもいいですか..

thrust::device_vector<int> D[5][10];

可能であれば、thrust::fill関数をどのように使用しますか。

私の目的は、推力ライブラリを使用してコードを最適化することです。

4

1 に答える 1

3

STL と推力では、ベクトルはデータ要素のコンテナーであり、厳密な線形シーケンスに準拠しているため、基本的には本質的に 1 次元です。要するに、これらのデータ要素は通常の型、さらには構造体やオブジェクトにすることもできますが、(STL とは異なり) 他のベクトルにすることはできません。

ベクトルの配列を作成できますが、それらのスラスト操作は通常、配列内の各ベクトルに対して 1 つずつ実行する必要があります。

構文に関しては、これを行うことはできません。

thrust::device_vector D[5][10];

次のようなことができます。

thrust::device_vector<int> D[5][10];

ただし、これはベクトルの2次元配列を作成しますが、これはあなたが望むものではないと思います。

多くの場合、2 次元配列は「平坦化」して 1 次元であるかのように扱うことができます。状況を詳しく知らなくても、これを調査することをお勧めします。おそらくポインタ インデックスを使用して、2 次元配列を 1 次元であるかのように扱うことができる場合は、たとえば、単一の throw::fill 呼び出しで全体を埋めることができます。

また、スラストクイックスタートガイドに慣れることをお勧めします。

これは、基本的なフラット化を使用したホスト上の 2D 配列を示す実際の例です。

#include <thrust/host_vector.h>
#include <thrust/device_vector.h>
#include <thrust/sequence.h>

#define H 5
#define W 10
__global__ void kernel(int *data, int row, int col) {

  printf("Element (%d, %d) = %d\n", row, col, data[(row*W)+col]);

}

int main(void)
{
    int h[H][W];
    thrust::device_vector<int> d(H*W);

    thrust::copy(&(h[0][0]), &(h[H-1][W-1]), d.begin());
    thrust::sequence(d.begin(), d.end());
    kernel<<<1,1>>>(thrust::raw_pointer_cast(d.data()), 2, 3);
    cudaDeviceSynchronize();

    return 0;
}
于 2013-03-28T14:49:30.543 に答える