gpt4 book ai didi

c - 是否可以在 CUDA 中使用推力库将推力::device_vector 和推力::fill 用于 2D 数组

转载 作者:行者123 更新时间:2023-12-03 02:09:21 26 4
gpt4 key购买 nike

我是新使用推力库。我有我的 CUDA C 代码,它使用全局 2D 数组。我在代码中使用内核函数初始化它。

我必须知道是否可以使用 thrust::device_vectorthrust::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 函数。

我的目标是使用推力库优化代码。

最佳答案

在 STL 和推力中,vector是数据元素的容器,遵循严格的线性序列,因此它本质上基本上是一维的。简而言之,这些数据元素可以是普通类型,甚至可以是结构体和对象,但不能是其他 vector (与 STL 不同)。

您可以创建一个 vector 数组,但通常需要对数组中的每个 vector 逐一进行推力操作。

关于语法,你不能这样做:

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

你可以这样做:

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

但是,这将创建一个二维 vector 数组,我认为这不是您想要的。

在许多情况下,二维数组可以被“展平”以像一维数组一样进行处理,并且在不了解更多关于您的情况的情况下,这就是我建议调查的内容。例如,如果您可以使用指针索引将二维数组视为一维数组,那么您可以使用单个推力::fill调用来填充整个数组。

我还建议熟悉推力 quick start guide .

这里是一个工作示例,显示了主机上具有基本扁平化的 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;
}

关于c - 是否可以在 CUDA 中使用推力库将推力::device_vector 和推力::fill 用于 2D 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15682254/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com