线程应该作用于单独的内存吗?

时间:2018-07-06 09:00:52

标签: c++ multithreading shared-memory

我有一个C ++程序,其任务是分析二进制数据流(通常是磁盘上的文件)并提取一些信息。此任务是“无内存”的,这意味着每个步骤的结果与上一个步骤无关。因此,我想通过将数据分配给单独的线程来加快性能,以提高性能。

目前,数据以1GB的块一次读取,并保存在数组中,以避免I / O瓶颈。我应该将数据分成n个块/数组(其中n是线程数)还是由多个线程访问的单个数组不是问题?

我有一个C ++程序,其任务是分析二进制数据流(通常是磁盘上的文件)并提取一些信息。此任务是“无内存”的,这意味着每个步骤的结果与上一个步骤无关。因此,我想通过将数据分配给单独的线程来加快性能,以提高性能。

目前,数据以1GB的块一次读取,并保存在数组中,以避免I / O瓶颈。我应该将数据分成n个块/数组(其中n是线程数)还是由多个线程访问的单个数组不是问题?

编辑1:数据和分析规范 我意识到,正如其中一项评论所指出的那样,问题的措词可能太宽泛了。我将尝试进一步详细介绍。

要分析的数据是由所谓的“时间数字转换器”(TDC)生成的一系列无符号64位整数,存储有关它们注册的某些事件的时间戳信息。我的TDC有多个通道,因此每个时间戳都有有关哪个通道触发(前3位),是上升沿还是下降沿触发(第4位)以及实际时间(自TDC加电以来的时钟滴答)的信息, 60位)。

当然,时间戳是按时间顺序保存在文件中的。任务是在用户设置的特定时间窗口内找到频道之间的重合事件。因此,您继续阅读时间戳,当在感兴趣的频道中找到两个时间间隔小于设置的时间戳时,就会增加同时发生事件的数量。

这些文件可能很大(数十GB),并且时间戳数量巨大(一个时钟滴答是80 pico 秒”)。

现在,我只浏览整个文件一次,其想法是将它“切成小块”,然后由不同的线程进行分析。削减之间可能发生的事件损失对我来说是可以接受的,因为最多将有2十万。

当然,他们会仅读取文件/内存中的数据。我可以将巧合计数写在三个单独的变量中,然后在所有线程结束时对它们进行求和,如果这样做有助于避免同步问题。

我希望现在情况更加清楚

1 个答案:

答案 0 :(得分:5)

是的,多个线程可以访问同一个数组:如果线程仅读取该数组(在这里似乎是这种情况),则不会有错误的共享效果。

要优化缓存的使用,可以使每个线程读取数组的连续元素(即交错读取线程之间的内容)。

作为一个旁注,您可能需要重新考虑1GB的块:太多了!您是否测量过它比1MB或10KB更好?

您可能还想并行化“文件读取”(一次一小块)和“处理读取的内容”(您使用许多线程),并使用(至少)两个数组(一个正在处理后,其他人将收到下一个读取的内容