【发布时间】:2014-05-01 21:26:27
【问题描述】:
GPGPU/Cuda 的所有教程和介绍材料都经常使用平面数组,但是我正在尝试移植一段代码,它使用比数组更复杂的对象。
我有一个 3 维 std::vector 我想在 GPU 上拥有它的数据。有哪些策略可以在 GPU 上实现这一点?
我暂时能想到 1:
- 将主机上的向量数据复制到更简单的结构中,例如数组。然而这似乎很浪费,因为 1) 我必须复制数据并然后发送到 GPU;和 2)我必须分配一个 3 维数组,其维度是任何向量中元素计数的最大值,例如使用二维向量
想象一下 {{1, 2, 3, 4, .. 1000}, {1}},在主机内存中,这些大约是 ~1001 个分配的项目,而如果我要将其复制到二维数组,我将不得不分配 1000*1000 个元素。
有更好的策略吗?
【问题讨论】:
-
您不必分配最大维度的 3D 数组。您只需要一个长度等于 3D std::vector 中 元素 数量的一维(即平面)数组。并且您需要每个子向量的起点的伴随(可能是一维)数组。 GPU 上的净存储要求可能最终类似于主机上 3D std::vector 的存储要求。有很多方法可以重构数据以适应 GPU。这个问题很宽泛。
-
谢谢罗伯特,对于第一部分,您的评论很可能是一个(接受的)答案。但是您因此确认需要重构主机上的数据结构?我希望有一些(cuda)函数可以获取对象(类或结构),并且可以有效地将实际值深度复制到设备,而无需先复制到主机内存中。
-
我可以建议最接近自动深度复制的是统一内存。但这仍然涉及一些代码重构,有一些特定的要求,目前不一定是一种高性能的方法。我发布了一个答案,其中包含一些要调查的事情的建议。尽管
std::vector的重构可能无关紧要,但许多类型的数据结构应该被重构以在 GPU 上产生更高的性能。