【问题标题】:How to convert SIMD bash commands into GPU processable commands?如何将 SIMD bash 命令转换为 GPU 可处理命令?
【发布时间】:2020-01-03 13:27:58
【问题描述】:

考虑一种 SIMD 类型的代码,它从这样的文件中提取模式匹配的所有实例:

grep grep -n <some_pattern>

使用 GNU Parallel 和一些类似的修改可以加快速度

cat fileName | parallel -j{cores} --pipe --block {chunk_size}M --cat LC_ALL=C grep -n '/some_pattern/'

如果将单个输入文件拆分为多个单独的文件,我也可以使用xargs 进行并行执行:

xargs -P {cores} -L {line_per_process} bash -c grep {1}< fileID*

但这种并行性受到您可以拥有的 CPU 内核数量的限制。

我想知道是否有任何方法可以将此类命令转换为 GPU(CUDA) 线程? 整个任务可以分成与 CPU 核心数量相等的块,然后每个 CPU 核心将这些块作为 GPU 中的单独线程处理?

【问题讨论】:

  • Q1:您是如何得出这样一个假设的,即 GNU 并行以 SIMD 方式运行(通过什么机制“粘合”-在所有 CPU 内核中same S-ingle I-nstruction,从而有资格被命名为 SIMD 执行模式)? Q2:您是否曾尝试将几 GB 的数据从主机端移动到设备端内存 (GPU) 中,您对这种尝试的延迟和吞吐量的亲身体验是什么? Q3: 是什么让您开始考虑 SIMD-GPU 内核从 SIMD 处理中获得任何优势,在

标签: bash parallel-processing gpu gnu-parallel


【解决方案1】:

通常你会受到磁盘的限制(你的磁盘很慢,grep 很快)。

如果你有非常快的磁盘试试:

parallel -a filename -k --pipepart --block -1 LC_ALL=C grep '/some_pattern/'

--pipe 的总传输速度约为 100MB/s。 --pipepart 可以提供大约 1 GB/s per core (通常您的磁盘无法提供 1 GB/s/core)。 --block -1filename 快速分割成每个作业一个块。

很遗憾,您无法查看行号(所以grep -n 会给出错误的答案)。

如果您的grep 仍然受 CPU 限制,那么您可能应该问另一个问题并详细说明为什么您的grep 如此 CPU 密集。

【讨论】:

  • 我的问题只给出了一个grep的例子。我不是在问一个具体的案例,而是一个关于如何将 SIMD bash 代码转换为 GPU 兼容代码的一般性问题。就像使用 xargs 启动具有行数或块数的进程,然后将块内的每个命令分解为单独的独立运行以使用 GPU 处理。我认为这可以解决数据传输的硬盘限制问题
【解决方案2】:

如果有这样的方法,我会感到惊讶。 grep 不像矩阵乘法,您对每个字节执行完全相同的机器代码指令。相反,grep 针对不同情况做了很多优化(例如,如果当前字节不匹配,则向前跳过这么多字节)。

因此,虽然您可以将此称为相同命令多数据 (SCMD),但它在机器代码级别不符合 SIMD 条件。

这并不意味着无法将grep 转换为真正的 SIMD,但这不会是自动的。您必须使用适用于 GPU 的算法重写 grep。这显然可以做到:https://www.cs.cmu.edu/afs/cs/academic/class/15418-s12/www/competition/bkase.github.com/CUDA-grep/finalreport.html

如果您想转换除grep 之外的其他工具,您将不得不再次重写该工具。可能使用您用于grep 的一些算法,但不一定:可能是您必须使用完全不同的算法。

【讨论】:

  • 仅作记录: 遗憾的是那些学生被允许在没有全部成本的情况下发布基准 - 他们故意省略了设置成本和终止成本他们工作的加速营销 - “这没有考虑将数据传输到 GPU 的开销。”
猜你喜欢
  • 2010-10-22
  • 2018-04-02
  • 1970-01-01
  • 2020-04-04
  • 2021-10-08
  • 2020-02-10
  • 1970-01-01
  • 2021-07-25
  • 2011-03-07
相关资源
最近更新 更多