【发布时间】: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 区域(每个共享映射一个)。对于两个关键区域:
- 对于 map_a :如果根据记录存在某种情况,则需要使用从记录派生的键将条目添加到映射中。如果条目已经存在,则需要对其进行更新。映射读取、潜在更新和写入存在一个关键区域。
- 对于 map_b :对于每条记录,必须更新地图。关键区域涵盖与 (1) 相同的操作,即读取、潜在更新/插入和写入。
所以,关于我的方法。我应该使用单独的 pthread 来缓冲 IO 吗?我是否应该简单地缓冲到一个巨大的内存分配缓冲区并创建pragma omp parallel for 对其记录子集的任务?我对这种编程没有经验。
提前致谢!
编辑:明确了关键区域的使用。
【问题讨论】:
-
您能否提供更多有关地图的详细信息以及如何使用它们?您也许可以删除关键区域。
-
@ElderBug 我已经在上面稍微澄清了一点,我可以稍后添加更多代码(目前暂时推迟)。不幸的是,我不相信可以删除关键区域,每个任务中的记录都没有唯一性,这会阻止读取/更新/写入两个映射中的相同键条目。我尝试使用原子写入,但我被旧版本的 OpenMP 卡住了。
标签: c++ multithreading performance parallel-processing openmp