【问题标题】:C++ Parallelising file I/O and analysis with OpenMP tasksC++ 使用 OpenMP 任务并行化文件 I/O 和分析
【发布时间】:2015-03-03 22:59:09
【问题描述】:

我目前正在开发一个系统,我在该系统中读取超过约 2 亿条记录(行)的文件,因此我认为我可以使用生产者-消费者模型来提高性能(在我阅读时工作)。但是,我并没有实现强大的性能,并且担心我的总体设计是错误的。把它放到上下文中:

int i = 0;
string buffer[MAX_SIZE];

//critical regions exist for map_a and map_b (shared below) in the task function 

#pragma omp parallel shared(map_a), shared(map_b), num_threads(X) 
#pragma omp single
{
    while (getline(fin, line) && !fin.eof())
    {
        buffer[i] = line;
        if (++i == MAX_SIZE)
        {
#pragma omp task firstprivate(buffer)
            work_on_data(buffer, map_a, map_b);
            i = 0;
        }
    }
}

缓冲区中的每条记录在work_on_data 中处理大约需要 49-95μ,由于条件而存在差异,我怀疑pragma omp critical 区域(每个共享映射一个)。对于两个关键区域:

  1. 对于 map_a :如果根据记录存在某种情况,则需要使用从记录派生的键将条目添加到映射中。如果条目已经存在,则需要对其进行更新。映射读取、潜在更新和写入存在一个关键区域。
  2. 对于 map_b :对于每条记录,必须更新地图。关键区域涵盖与 (1) 相同的操作,即读取、潜在更新/插入和写入。

所以,关于我的方法。我应该使用单独的 pthread 来缓冲 IO 吗?我是否应该简单地缓冲到一个巨大的内存分配缓冲区并创建pragma omp parallel for 对其记录子集的任务?我对这种编程没有经验。

提前致谢!


编辑:明确了关键区域的使用。

【问题讨论】:

  • 您能否提供更多有关地图的详细信息以及如何使用它们?您也许可以删除关键区域。
  • @ElderBug 我已经在上面稍微澄清了一点,我可以稍后添加更多代码(目前暂时推迟)。不幸的是,我不相信可以删除关键区域,每个任务中的记录都没有唯一性,这会阻止读取/更新/写入两个映射中的相同键条目。我尝试使用原子写入,但我被旧版本的 OpenMP 卡住了。

标签: c++ multithreading performance parallel-processing openmp


【解决方案1】:

关于 IO,我认为您不会获得太多性能,因为它应该已经被操作系统很好地缓冲了。您总是可以尝试自己实现大缓冲(可能与生产者/消费者一起),或使用内存映射文件,但恐怕您会对性能提升感到失望(而且 getline 要简单得多)。

关于文件分析,您当然应该尝试优化计算本身,但如果您可以删除关键区域,则可能会获得更好的收益。通常,目标是完全消除对共享对象的依赖。如何做到这一点取决于您的应用程序,但总体思路是在每个线程中进行独立处理,然后将结果合并在一起。在您的情况下,您可以在每个线程中分配独立的地图,然后更新真实的地图。如果您需要原始地图进行处理,请阅读它们但不要更新/写入它们,编写独立对象并稍后更新。这样您就可以删除关键区域(读取操作是线程安全的)。

附带说明,这是非常特定于应用程序的,也是特定于硬件的。如果您的处理时间与文件读取相比较短(这在很大程度上取决于您的 CPU/HDD/SSD),您可能会通过更好的 IO 缓冲获得更多性能,甚至可能使多线程变得无用。此外,如果结果合并太重,拆分结果可能不值得。如何拆分/合并结果很重要;您可以只构建一个更新列表,或者构建一个您将合并的实际地图。关键区域也可能没有问题。尝试进行实验,看看哪种方法更适合您。

【讨论】:

  • 您考虑简单地删除关键区域当然是正确的。第一个是大猪,我得到了相当大的速度。现在我面临着高效数据合并的挑战...我会尽快回复您!
  • 我听取了您的建议,并一直致力于合并数据。不幸的是,我在从每个pragma omp task 中提取数据时遇到了一些问题,正如我在stackoverflow.com/questions/27849876/… 提出的这个问题中所解释的那样
  • @PidgeyBAWK 我评论了另一个问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多