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