将Billion Integers初始化为值1

时间:2011-12-01 16:00:52

标签: c++ c linux performance

在具有32GB DRAM的linux平台8核CPU上使用c / c ++初始化十亿整数的优秀posix线程设计是什么? 谢谢你的帮助。

5 个答案:

答案 0 :(得分:8)

这是一项简单的操作,您无需考虑多线程。只需在单个帖子中使用memcpy即可。

答案 1 :(得分:4)

线程的确切数量不会是一个限制因素,但有时对于这个问题值得过度使用,比如每个物理核心使用2个线程。

但真正的瓶颈将是IO,将数据写入RAM。在删除之前,您必须注意要替换的数据永远不会读取。然后你应该确保对内存的写入以大块的形式出现,并且(如果可能的话)作为“直写”,现代CPU有后续指令。

通常像memcpy这样的包含您想要查看的模式的固定大小的缓冲区(某些页面)应该得到很好的优化。

答案 2 :(得分:2)

这是为了什么?根据用途,以下方案可能有效:您将一个内存页面(即几KB)初始化为全1。然后根据需要将该页面映射到虚拟地址空间中,并使用写时复制标记。通过这种方式,在读取时,您将从所有这些虚拟页面中获取所有虚拟页面,在编写系统时,将根据需要分配更多物理页面。

答案 3 :(得分:1)

也许是divide and conquer algorithm?将包含整数的内存按与系统最佳线程数相对应的某个数字进行分区。然后为每个分区启动一个线程,初始化它的所有整数。

答案 4 :(得分:0)

如果您尝试进行多线程处理,则将写入与本机缓存行大小对齐可能会提供最佳内存吞吐量。正如大家所说,内存吞吐量将主导性能,但这些写入需要一部分CPU时间。使用多线程和矢量化指令最大限度地缩短时间可能会有所帮助。

真正的答案是对您的系统进行分析(因为您说明了一个非常具体的目标,听起来您不想设计一个对大多数目标来说足够好的平衡算法)。能够访问32GB DRAM的现代CPU通常具有硬件性能计数器(英特尔和AMD公司),这使得查找CPU,缓存活动非常容易。