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;
}