我的程序:100% 基于 CPU 和 RAM, 施行数学计算,一开始将数据从HDD读取到RAM中。线程之间没有通信。线程,全部采用同时也(差不多)。
问题:
如果我的程序使用的线程数等于 CPU 线程数,那么我能从 2 CPU 系统中获得什么样的性能?
假设我使用两个 8 核 Xeon,每个有 16 个线程,所以总共有 16x2 = 32 个线程。如果我的程序使用 32 个线程,所有线程的使用率均为 100%,那么我能否获得比单个相同 CPU 两倍的性能?
答案1
实际上,你能给出的最佳答案是“可能不会,但这取决于具体情况”。你有两倍的原始 CPU 马力可用,但是:
您实际上不会拥有两倍的可用内存带宽。
在 CPU 之间“乒乓”一些缓存行需要花费时间。
有时一个线程必须等待另一个线程,并且线程越多,发生这种情况的次数就越多。
有时候,尽管你有很多工作要做,但你也无法一次性全部完成。
等等。
在极少数情况下,你实际上可以得到更多的性能提高一倍以上。如果某个操作受限于缓存,则拥有更多内核可能意味着线程可以运行更长时间(因为内核没有其他任务要做,因为其他内核正在执行这些任务),从而使 CPU 缓存保持更长时间的热度。
答案2
性能问题的最终答案是不要猜测,而是测试!
答案3
听起来你正在研究令人尴尬的平行计算任务,在这种情况下答案是肯定的,您的吞吐量将随着使用的总 CPU 线程数几乎线性地扩展。