CUDA:揭开 2D 和 3D 数组的奥秘
在 CUDA 中使用 2D 和 3D 数组时会出现许多问题,并且答案相互矛盾可能会令人沮丧。为了解决这些问题,让我们深入研究常见的解决方案及其含义:
2D 数组分配:mallocPitch 与 Flatten
通常,cudaMallocPitch 和 cudaMemcpy2D 用于 2D数组。然而,这些 API 函数实际上适用于倾斜分配,而不是真正的 2D 数组。它们需要连续的内存,这是使用 malloc 或循环无法实现的。
对于真正的 2D 数组,推荐的方法是展平。通过在 1D 数组中连续存储元素,您无需进行指针追逐并降低复杂性。
3D 数组分配:拥抱复杂性还是拥抱扁平化
动态分配 3D与 2D 数组相比,数组引入了显着的复杂性,通常会导致建议进行扁平化。或者,存在特殊情况,其中已知的编译时维度允许更有效地处理 2D 和 3D 数组。
主机代码中的 2D 访问,设备代码中的 1D 访问
混合方法允许您在主机代码中维护 2D 访问,同时在设备代码中利用 1D 访问。这涉及组织分配和管理指针以简化主机和设备之间的数据传输。
具有嵌套指针的对象数组的注意事项
具有嵌套指针的对象数组类似于二维数组。动态分配和展平是可行的选择,但您应该意识到与动态分配对象相关的潜在开销。
结论
处理 2D 和 2D 对象的方法的选择CUDA 中的 3D 数组将取决于您的具体要求。虽然使用真正的 2D 数组是可行的,但增加的复杂性通常有利于扁平化或使用上述将 2D 主机代码访问与 1D 设备代码访问混合在一起的混合方法。
以上是我应该如何在 CUDA 中处理 2D 和 3D 数组以获得最佳性能?的详细内容。更多信息请关注PHP中文网其他相关文章!