在 STL 和推力中,向量是数据元素的容器,遵循严格的线性序列,因此本质上基本上是一维的。总之,这些数据元素可以是普通类型,甚至是结构体和对象,但它们不能是其他向量(与 STL 不同)。
您可以创建一个向量数组,但对它们的推力操作通常需要对数组中的每个向量一个接一个地完成。
关于语法,您不能这样做:
thrust::device_vector D[5][10];
你可以这样做:
thrust::device_vector<int> D[5][10];
但是,这将创建一个 2-D向量数组,这不是您想要的,我不认为。
在许多情况下,二维数组可以被“展平”以像一维一样处理,并且在不了解您的情况的情况下,这是我建议调查的内容。如果您可以使用指针索引将您的二维数组视为一维数组,那么您可以使用单个推力::fill 调用填充整个事物,例如。
我还建议您熟悉推力快速入门指南。
这是一个工作示例,显示了主机上的二维数组,并进行了基本的展平:
#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;
}