【问题标题】:Read multiple text files in parallel using Cuda使用 Cuda 并行读取多个文本文件
【发布时间】:2012-02-16 18:07:21
【问题描述】:

我想使用 CUDA 在多个文件中并行搜索给定的字符串。我计划使用 pfac 库来搜索给定的字符串。问题在于如何并行访问多个文件。

示例:我们有一个文件夹,其中包含 1000 多个必须搜索的文件。

这里的问题是我应该如何访问给定文件夹中的多个文件。文件夹中的文件应该是动态获取的,并且应该为每个线程分配一个文件来搜索给定的字符串。

有可能吗????

编辑:

在这篇文章中:very fast text file processing (C++)。他正在使用 boost 库在 16 秒内读取一个 3 GB 的文本文件。而在我的情况下,我必须读取 1000 个较小的文件

谢谢

【问题讨论】:

  • 通常有多少个文件? 10 秒、100 秒、1000 秒,还有更多?
  • 有可能。问题在于,由于单磁头,从磁盘读取它们本质上是顺序的。如果搜索是一个类似搜索的字符串,你可能很难在这方面击败 grep。
  • 所以你的意思是可以并行读取文件,但这会比 grep 慢。我必须在文件内容中搜索给定的字符串,如果你弄错了,我不是在搜索文件名.
  • 是的,这对于 CUDA 来说似乎不是一个好方法——从磁盘读取文件然后将数据复制到 GPU 内存的成本可能远远大于任何可能的速度优势字符串搜索。唯一有意义的方法是,如果您需要对同一组文件进行多次搜索,并且可以同时将所有文件加载到 GPU 内存中。
  • 如果这听起来很傻,我很抱歉,因为我是 cuda 的新手,但是将文件传输到 GPU 内存是强制性的。我不想将文件复制到 GPU 内存。还有其他选择吗???

标签: boost cuda pattern-matching parallel-processing


【解决方案1】:

在 CUDA 中执行任务与在 CPU 中执行相同操作相比没有多大帮助。

假设您的文件存储在标准的磁性 HDD 上,典型的单线程 CPU 程序会消耗:

  1. 约5ms找到存放文件的扇区,放到读头下。
  2. 将 1MB 文件(假设读取速度为 100MB/s)加载到 RAM 内存中大约需要 10 毫秒
  3. 不到 0.1 毫秒即可将 1MB 数据从 RAM 加载到 CPU 缓存并使用线性搜索算法对其进行处理。

单个文件需要 15.1 毫秒。如果你有 1000 个文件,完成这项工作需要 15.1 秒。

现在,如果我为您提供具有无限内存带宽、无延迟和无限处理器速度的超强大 GPU,您将能够立即执行任务 (3)。但是,HDD 读取仍将消耗完全相同的时间。 GPU 无法并行化另一个独立设备的工作。 因此,您现在将在 15.0 秒内完成,而不是花费 15.1 秒。

无限 GPU 将为您提供 0.6% 的加速。一个真正的 GPU 甚至不会接近那个!


在更一般的情况下:如果您考虑使用 CUDA,请问自己:实际计算是否是问题的瓶颈?

  • 如果是 - 继续在 CUDA 世界中寻找可能的解决方案。
  • 如果没有 - CUDA 无法帮助您。

如果您要处理数以千计的小文件并且需要经常执行读取操作,请考虑可以“解决”您的瓶颈的技术。一些可能包括:

  • RAM 缓冲
  • 将硬盘置于 RAID 配置中
  • 获取 SSD

可能还有更多选择,我不是该领域的专家。

【讨论】:

    【解决方案2】:

    是的,使用 CUDA 可能会加快速度如果您可以减少读取延迟/带宽的影响。一种方法是同时执行多个搜索。 IE。如果您可以在大型 haystack 中搜索 [needle1], .. [needle1000],那么每个线程都可以搜索 haystack-pieces 并存储命中。需要对每次比较所需的吞吐量进行一些分析,以确定您的搜索是否有可能通过使用 CUDA 得到改进。这可能有用http://dl.acm.org/citation.cfm?id=1855600

    【讨论】:

      猜你喜欢
      • 2019-02-10
      • 1970-01-01
      • 2016-08-14
      • 1970-01-01
      • 2012-05-24
      • 2014-06-13
      • 1970-01-01
      • 2018-07-12
      • 1970-01-01
      相关资源
      最近更新 更多