我正在开发计算几何领域的数据结构和算法。能够可靠地比较两种算法的运行时间非常重要。
问题在于,当我运行算法并运行30分钟时,我不能说那些30分钟花在执行算法而不是播放mp3上。
我有一台运行Ubuntu 13.04的英特尔®酷睿™i7-2600 CPU @ 3.40GHz×8处理器计算机。我的所有程序都是用C ++编写的,只使用用C或C ++编写的库。
这是否意味着我可以安全地运行让6个并行实验,而操作系统会将其他2个用于自己的业务?
我应该将实验作为一个程序的6个线程运行,还是制作6个不同的可执行文件并运行它们?
这两种方法有什么区别?
答案 0 :(得分:3)
如果您想要一致的结果,一次运行一个基准测试将提高这种可能性 - 因为不同的任务更有可能:
如果你在播放MP3的同时运行基准测试,下载重磅特写长片等,那么你就不会知道这是否真的干扰了你的CPU密集型任务(或干扰了多少) - 你可以,反过来说,如果音乐开始变得不稳定,或下载超时......;)与并行运行多个任务一样,缓存和从处理器到处理器核心的移动将是最重要的影响。
你可能会发现,如果你运行一组基准“一切都在”和另一组基准“一切都关闭”,那就没有区别了。但是你也可能会发现它确实有所作为。
这同样适用于运行一个或多个基准测试。尝试并行运行6,并比较每个基准测试本身在运行时所用的时间。
您只知道通过比较不同的情况。
如果没有区别,你可以继续播放音乐,下载最新的大片电影等,同时进行基准测试,因为你知道0.01%的差异对应用程序的整体性能并不重要。
根据经验,我发现如果你在后台运行一堆其他“轻”的东西通常不会产生太大的影响,但它会增加从一次运行到另一次运行的变化量。同样,如果基准测试运行半小时,它可能无关紧要 - 毕竟,您可能在运行时从一次运行到另一次运行时有足够的变化,只需从CPU和操作系统中不同的一般事物,纯粹通过“事物不会每次都发生完全相同”的因素,它不会产生足够的差异。
如果您正在进行小优化,例如切换结果差异为0.5%的编译器选项,但运行之间的差异为1%,则需要运行多次运行以显示实际差异,并且干扰越多从其他过程来看,您无法衡量小变化的可能性就越大。有时,许多小的变化可以产生显着的差异(例如,如果你移动一个函数F1以允许它内联,然后执行相同的功能F2,它们一起相当于1%的改进,但单独它是不可测量的,因为它隐藏在噪音中)。噪音越大,你就越有可能“错过”一些小但最终有益的变化。
答案 1 :(得分:1)
首先:Intel i7-2600有4个“真正的”内核,但每个内核可以并行运行两个线程。通过操作系统调度程序的抢占,这种“超线程”比传统的线程更快。因为执行可以在另一个线程上继续,如果一个线程必须等待很短的时间(比如在高速缓存未命中后从主存储器读取值),超线程往往会增加吞吐量。因此,在超线程核心上运行的两个进程的组合性能通常比在同一核心上运行的单个进程的性能高10%到20%。在高缓存压力的情况下,组合性能可能会更差。
但是,对于您的性能计时需求更重要:如果一个核心上的两个线程具有120%的组合性能,则意味着单线程性能降至60%!
据我所知,到目前为止,Linux内核调度程序已经知道超线程,因此如果第一个线程正在做繁重的工作,并且还有可用的内核,它将尝试使每个内核上的第二个线程保持空闲状态。因此,如果您并行启动3个计时进程并为您的桌面留下一个核心,并且不做多少工作(如编译等),那么您应该获得相当一致的计时数据!如果您启动4个进程,请确保桌面确实处于空闲状态。如果您启动5个或更多进程,则由于超线程而导致时序结果不一致。
如果您在shell上使用时间来为命令计时,则报告的用户和系统时间往往比总时间更准确。这是因为操作系统仅计为用户和系统时间,该进程实际上分别在用户空间或系统中运行。如果您的代码没有做太多I / O,系统时间应该很短,用户时间应该接近总运行时间。