gpt4 book ai didi

c++ - 推力 : Accessing a device variable created with cudaMallocPitch

转载 作者:行者123 更新时间:2023-11-30 02:39:31 32 4
gpt4 key购买 nike

我有一个数据矩阵,我应该使用 GPU(以及可能的 thrust 库)对其进行一些详细说明。到目前为止,我已经能够将数据复制到 GPU 并编写自己的内核函数。现在,根据我的内核函数的输出,我将利用 thrust 库对同一数据矩阵进行其他阐述,尽可能避免从 GPU<->CPU 下载和重新上传数据。

因此,我使用 cudaMallocPitch 函数在 GPU 中创建了一个设备变量:

float *d_M;
size_t pitch;
cudaStatus = cudaMallocPitch(&d_M, &pitch, sizeof(float)*(N), M+1);
if (cudaStatus != cudaSuccess)
{
fprintf(stderr, "cudaMalloc Failed!");
INFO;
return CUDA_MALLOC_ERROR;
}

此变量表示维度为 NxM+1 的矩阵。在使用 ad-hoc cuda 函数对 GPU 进行一些详细说明后,我将使用推力库对每一行的元素求和,并将结果放在每一行的 M+1 列。

对于这样的操作,我会使用 thrust 库。我的意图应该是检索使用 cudaMallocPitch 创建的原始指针,将其转换为thrust::device_ptr,然后使用 thrust 函数对其进行操作。所以,在代码中:

    thrust::device_ptr<float> dd_M = thrust::device_pointer_cast(d_M);

但是,当我尝试打印两个变量的地址以确保指针具有相同的地址时:

printf("Address d_M: %p\n", &d_M);
printf("Address dd_M: %p\n", &dd_M);

我得到了不同的地址值。我不知道我做错了什么。对于这样的操作,我只是按照链接 Thrust - Memory Management Functions 上的推力手册进行操作。 .

最佳答案

cudaMallocPitch 基本上无法使用推力。这是因为它创建了这样的分配:

D D D D D D D D D D D D D D X X
D D D D D D D D D D D D D D X X
D D D D D D D D D D D D D D X X
D D D D D D D D D D D D D D X X
D D D D D D D D D D D D D D X X
...

D 项代表您的实际数据,X 项代表附加到每一行的额外空间,以使您的数据宽度与所需的机器间距相匹配。

问题是 thrust 没有这个由 X 表示的“未使用”区域的概念。当数据中有“未使用”的间隙时,没有方便的方法告诉推力函数分配线程(并生成适当的、连续的索引)。因此,如果我们将上述内容转换为推力 vector :

D D D D D D D D D D D D D D X X D D D D D D D D D D D D D D X X D D ...

分散在 vector 中的 X 区域在推力算法和索引中不能方便地“跳过”。如果你真的想这样做,可能会想出一个 thrust::permutation_iterator 来解决上面的映射,但这将有其自身的低效率,这将超过任何对倾斜数据进行操作带来的性能优势。

如果您改用 cudaMalloc,那么您的数据将是连续的,正如 thrust 所期望的那样。

关于c++ - 推力 : Accessing a device variable created with cudaMallocPitch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29783396/

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