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

Should threads act on separate memory?

我有一个 C++ 程序,其任务是分析二进制数据流(通常是磁盘上的文件)并提取一些信息。这个任务是 "memory-less",这意味着每一步的结果都独立于前一步。因此,我想通过将数据交给单独的线程来加快速度以提高性能。

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

我有一个 C++ 程序,其任务是分析二进制数据流(通常是磁盘上的文件)并提取一些信息。这个任务是 "memory-less",这意味着每一步的结果都独立于前一步。因此,我想通过将数据交给单独的线程来加快速度以提高性能。

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

编辑 1:数据和分析规范 正如其中一条评论所指出的,我意识到问题的措辞可能过于宽泛。我会尝试更详细一点。

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

当然,时间戳是按时间顺序保存在文件中的。任务是在用户设置的特定时间 window 内找到通道之间的重合事件。所以你继续阅读时间戳,当你在感兴趣的通道中发现两个时间距离小于设定的通道时,你增加了巧合事件的数量。

这些文件可能非常大(数十 GB)并且时间戳的数量巨大(一个时钟滴答为 80 秒)。

现在我只浏览整个文件一次,我的想法是 "cut it" 分成更小的部分,然后由不同的线程进行分析。剪辑之间可能丢失的事件对我来说是可以接受的,因为最多只有几十万分之二。

当然,他们只会从file/memory读取数据。我可以将巧合计数写在三个单独的变量中,然后在所有线程完成时对它们求和,如果这有助于避免同步问题的话。

我希望现在事情更清楚了。

是的,同一个数组可以被多个线程访问:如果线程只读取数组(这里似乎就是这种情况),就不会有假共享效果。

为了优化缓存使用,您可以让每个线程读取数组的连续元素(即而不是在线程之间交错读取)。

附带说明一下,您可能需要重新考虑 1GB 块:太多了!您是否测量过它比 1MB 或 10KB 更好?

您可能还想并行化 "file reading"(一次一个小块)和 "processing the content that was read"(像您一样使用许多线程),使用(至少)2 个数组(一个正在已处理,另一个将收到下一个读取)