Thrust:访问用cudaMallocPitch创建的设备变量
Thrust: Accessing a device variable created with cudaMallocPitch
我有一个数据矩阵,我应该使用GPU(尽可能使用推力库)对其进行一些详细说明。到目前为止,我能够将数据复制到GPU并编写自己的内核函数。现在,根据我的内核函数的输出,我将利用推力库对同一数据矩阵进行其他阐述,尽可能避免从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列上。
对于这种操作,我会使用推力库。我的意图应该是检索使用cudaMallocPitch创建的原始指针,将其转换为推力::device_ptr然后使用推力函数对其进行操作。所以,在代码中:
thrust::device_ptr<float> dd_M = thrust::device_pointer_cast(d_M);
但是,当我试图打印两个变量的地址以确保指针具有相同的地址时:
printf("Address d_M: %pn", &d_M);
printf("Address dd_M: %pn", &dd_M);
我得到了不同的地址值。我不知道我做错了什么。对于这样的操作,我刚刚在链接推力-内存管理功能中遵循了推力手册。
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
项表示附加到每行的额外空间,以使数据宽度与所需的机器间距相匹配。
问题是,推力对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 ...
分散在矢量中的CCD_ 5区域在推力算法和索引中不能方便地"跳过"。如果你真的想这样做,也许可以想出一个解决上述映射的thrust::permutation_iterator
,但它本身的效率低下,这将超过对倾斜数据进行操作带来的任何性能优势。
如果您使用cudaMalloc
,那么您的数据将是连续的,正如推力所期望的那样。
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 如果不分配内存,我如何能够为变量创建和分配值?
- 正在头类中为私有变量创建内联函数
- 显示 C++ 中"anonymous"变量创建的警告
- 基于输入变量创建JSON结构
- 使用ROS2环境变量创建C 项目
- 尝试使用自定义类的结构中的变量创建该类的优先级队列
- 为变量创建局部别名会增加开销吗?
- 非静态成员变量创建,如C++中的静态单例创建
- 有没有更好的方法来通过 C/C++ 中的环境变量创建路径
- main () 是使用自动变量创建的,如果是这样,它的目的是什么?
- 我应该用switch语句从变量创建C++模板化对象吗
- 尝试使用值初始化列表,但在使用变量创建大小时不起作用
- 使用变量创建数组
- 为变量创建副本
- <type> 为结构变量创建矢量类型的对象
- 在定义充满成员的结构体时,是否为该结构体类型的每个变量创建这些成员?
- 如何使用要在 cmd 中执行的变量创建命令
- 使用另一个变量创建name变量