2013-05-18 19 views
0

看我的代码,在这个帖子:多线程简单基准测试中的PC性能和稳定性问题。如何使每个线程在单独的核心上运行?

https://stackoverflow.com/questions/16594768/how-to-write-simple-speed-test-app-with-cuda

这次我不看好CUDA,但应用程序的代码,在后。我想要面对的问题是,应用程序在返回总分的情况下相当不稳定。在我第一次编译它之后,它返回的值在12.2 - 12.5 mld之间,测试时间等于10 secons,但是在PC关闭之后,它一直返回值大约。 15个测试时间相同的mld。我想了一会儿,我的电脑发生了一些事情,但在其他专业测试中,它更稳定 - 例如。 mdcrackGUI基准总是返回给我约。每次运行它时,第一个值为1.32亿。聪明的思维片刻后不过我有撂荒问题:

  1. 我有8个逻辑CPU内核,但我不知道每个计算线程仅使用一个相同的逻辑核心,而测试运行。如果可能,如何修改代码以确保这一点?

  2. 有8个计算线程,但我有4个而不是8个物理核心CPU(由于HT技术)。我猜这意味着所有8个线程都不会真正并行运行。如果第一个问题有肯定的答案,那么如果我仅使用4个计算线程(每个计算线程在不同的物理内核上),这个应用程序是否会更稳定?

+1

获得基准测试结果一致重现是一种黑色艺术,主要基于公然的谎言。影响代码性能的因素很多,其中包括您的机器上运行的其他奇数千线程也需要一部分处理器。即使是环境因素,如温度。只是不要打扰。 –

+0

使用线程关联将线程绑定到核心。 http://msdn.microsoft.com/en-us/library/windows/desktop/ms686247(v=vs.85).aspx –

+0

我完全同意@Hans。另外,尝试超越操作系统调度程序并将线程绑定到特定内核几乎总是毫无意义的。调度人员的工作比你做得更好,同时考虑到所有其他过程,而不仅仅是你自己的过程。 – syam

回答

0

我对CPU上的CUDA没有太多经验(仅用于GPU),但通常线程是由操作系统分配给CPU内核的。您可以强制线程在指定的CPU Core上运行,但不建议这样做。操作系统总是知道什么核心最适合运行一个线程,因为它知道你的程序外核心有哪些其他负载。

对于第二个问题,HyperThreading概念的工作原理是线程/进程在等待来自RAM和IO的数据(如硬盘,网络等)时会有很多“停机时间”内存。 当您的线程正在等待读取或写入完成时,内核将切换到另一个线程。使用超线程技术,这在某些参数(如同样的程序代码内)下非常快,而在IO和RAM中,繁重的进程可能会使您看起来真的有8个内核而不是4个。 在您的程序中,正在运行的线程,所以您将从8个计算线程的实际运行中受益匪浅。在HT

更多信息:https://en.wikipedia.org/wiki/Hyper-threading

当然,做最好的事情是简单的测试。用4个线程进行测试,用8个线程进行测试。没有确切的“正确”答案。它可以不同于计算机。

0

要添加到@Wildex答案,对CPU密集型任务进行一些小试验。 4/8核心i7:

8 tests, 
8 tasks, 
counting to 1000000, 
using 4 threads: 
Validated: 1000000 in 1248ms 
Validated: 1000000 in 1388ms 
Validated: 1000000 in 1404ms 
Validated: 1000000 in 1248ms 
Validated: 1000000 in 1279ms 
Validated: 1000000 in 1389ms 
Validated: 1000000 in 1310ms 
Validated: 1000000 in 1482ms 
Average time: 1343ms 
Total validated: 8000000 


8 tests, 
8 tasks, 
counting to 1000000, 
using 8 threads: 
Validated: 1000000 in 936ms 
Validated: 1000000 in 904ms 
Validated: 1000000 in 936ms 
Validated: 1000000 in 921ms 
Validated: 1000000 in 951ms 
Validated: 1000000 in 968ms 
Validated: 1000000 in 920ms 
Validated: 1000000 in 920ms 
Average time: 932ms 
Total validated: 8000000