我需要提高解析 XML 文件并将其内容添加到大型 SQL 数据库的软件的性能。我一直在尝试查找有关是否可以在 GPU 上实现此功能的信息。除了可以使用 C/C++、FORTRAN 和许多其他语言开发软件以启用 GPU 处理这一事实之外,我对 CUDA 和 OpenCL 的研究让我没有任何明确的答案。这导致我问这个问题:我真的需要为 GPU 加速编写的 API 或库,还是使用标准 XML 解析库用 C/C++ 编写并使用 CUDA/OpenCL 的编译器指令编译的程序会自动运行 XML GPU上的库函数?
3 回答
一般来说,GPU 不适合 XML 处理加速...只有当预期任务具有大规模并行性以利用大量 GPU 处理单元时,GPU 才适用。另一方面,XML 处理主要是单线程状态机过渡工作类型。
实际上,我认为在 GPU 上解析 XML 没有任何意义。GPU 架构专注于海量浮点数计算,而不是文本处理等操作。我认为使用 CPU 并在线程之间拆分 XML 解析以利用多个内核要好得多。在我看来,在这样的应用程序中使用 GPU 是矫枉过正的。
首先看一下你的xml的结构。在此链接之后,您可以找到适用于并行处理的 XML 结构的标准。 Java 中的并行 XML 解析
如果您的 xml 结构是可并行处理的,那么有几个想法:
据我所知,XML 解析需要堆栈结构来记住树中的当前位置并验证节点的正确打开和关闭。
堆栈结构可以表示为带有堆栈指针的一维数组。堆栈指针包含数组中堆栈顶部元素的位置
他们说您可以将数组存储在一维纹理中(最多 4,096 个元素)。或在 2D 纹理中(最大 16,777,216 = 4,096x4,096 个元素)...查看以下链接以获取更多信息 https://developer.nvidia.com/gpugems/GPUGems2/gpugems2_chapter33.html
如果为每个唯一元素名称分配单独的浮点数,则可以将元素存储为数字
如果您将输入文本作为 ascii/utf-8 代码数组,那么为什么不将它们存储为浮点数数组呢?
使用 GPU 要考虑的最后一件事是输出结构是什么。
如果您需要例如固定长度列的表行,那么它只是关于如何在浮点数的一维或二维数组中表示这种结构
当您确定之前的观点并且 GPU 适合您时,只需编写函数将您的数据转换为纹理并将纹理返回您的数据
然后当然是整个 xml 解析器......
我从来没有尝试过用 GPU 编程,但我似乎很快就会说有些事情是不可能的......
应该有人第一个构建整个算法并尝试使用GPU是否有效