看看我在这篇文章中的代码:
https://stackoverflow.com/questions/16594768/how-to-write-simple-speed-test-app-with-cuda这一次我不是关于CUDA,而是在帖子中的应用程序代码。我想要面对的问题是,应用程序在返回总分的情况下非常不稳定。在我第一次编译它之后,它在12.2 - 12.5 mld之间返回值,测试时间等于10秒,但今天在PC关闭并打开后,它一直返回值。15个MLD,测试时间相同。我以为我的电脑出了什么问题,但在其他专业测试中,它要稳定得多。mdcrackGUI基准测试总是返回我大约。每次运行时,第一个值都是1.32亿。然而,经过一段时间的聪明思考,我有以下问题:
我有8个逻辑CPU内核,但我不确定每个计算线程在测试运行时只使用一个相同的逻辑内核。如果可能的话,如何修改代码以确保这一点?
有8个计算线程,但我有4而不是8个物理核心CPU(因为HT技术)。我猜这意味着所有8个线程不会真正并行运行。如果第一个问题有肯定的答案,那么如果我只使用4个计算线程,每个线程在不同的物理核心上,这个应用程序不是更稳定吗?
我在CPU上使用CUDA的经验不多(只在GPU上使用过),但通常线程是由操作系统分配给CPU内核的。您可以强制线程在指定的CPU核心上运行,但不建议这样做。操作系统总是知道哪个内核最适合运行一个线程,因为它知道程序之外的内核上有什么其他负载。
对于第二个问题,超线程概念的工作原理是线程/进程在等待RAM和IO(如硬盘,网络等)的数据时将有很多"停机时间",在您的情况下主要是RAM。当线程等待读取或写入完成时,核心将切换到另一个线程。使用超线程,在某些参数内(例如在相同的程序代码内)这真的很快,并且在IO和RAM繁重的进程中,可以使您看起来真的有8个内核而不是4个。在您的程序中,您从每个正在运行的线程中写入一个变量,因此您将从实际运行8个计算线程中受益匪浅。
更多关于HT的信息:https://en.wikipedia.org/wiki/Hyper-threading
当然,最好的方法就是简单地测试。4个线程测试,8个线程测试。没有绝对的"正确"答案。每台电脑都不一样
要添加到@Wildex答案中,对cpu密集型任务进行一个小试验。4/8 core 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