В STL и тяге вектор — это контейнер элементов данных, придерживающийся строгого линейная последовательность, поэтому по своей природе она в основном одномерна. По сути, эти элементы данных могут быть обычными типами и даже структурами и объектами, но не могут быть другими векторами (в отличие от STL).
Вы можете создать массив векторов, но операции над ними, как правило, должны выполняться один за другим для каждого вектора в массиве.
Что касается синтаксиса, вы не можете сделать это:
thrust::device_vector D[5][10];
Вы можете сделать что-то вроде этого:
thrust::device_vector<int> D[5][10];
Однако это создаст двумерный массив векторов, а это не то, что вам нужно, я не думаю.
Во многих случаях двумерные массивы можно «сгладить», чтобы обрабатывать их так, как если бы они были одномерными, и, не зная больше о вашей ситуации, я бы рекомендовал исследовать это. Если вы можете обращаться со своим двумерным массивом так, как если бы он был одномерным, возможно, с помощью индексации указателя, то вы можете заполнить все это, например, одним вызовом Thrust::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;
}
28.03.2013
thrust::sequence
звонка, который у меня есть, вы могли бы сделатьthrust::fill(d.begin(), d.end(), 27);
29.03.2013