如何将SIMD bash命令转换为GPU可处理命令?

时间:2019-08-30 09:39:46

标签: bash parallel-processing gpu gnu-parallel

考虑一种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中的单独线程进行处理?

2 个答案:

答案 0 :(得分: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的某些算法,但不一定是:您可能必须使用完全不同的算法。

答案 1 :(得分:1)

通常情况下,您会受到磁盘的限制(磁盘速度很慢,grep速度很快)。

如果您的磁盘非常快,请尝试:

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

--pipe总共可以交付100MB / s的速度。 --pipepart可以按每个 核心的速度交付1 GB / s(通常,磁盘不能按1 GB / s / core的速度交付)。 --block -1即时将filename切成一个作业块。

不幸的是,您失去了查看行号的能力(因此grep -n会给出错误的答案)。

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