0

看看我在这篇文章中的代码:

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 亿。然而,经过片刻的巧妙思考,我提出了以下问题:

  1. 我有 8 个逻辑 CPU 核心,但我不确定每个计算线程在测试运行时是否只使用一个且相同的逻辑核心。如果可能的话,如何修改代码以确保这一点?

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

4

2 回答 2

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
于 2013-05-18T18:18:52.393 回答
0

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

对于第二个问题,超线程概念适用于这样一个事实,即线程/进程在等待来自 RAM 和 IO(如硬盘、网络等)的数据时会有很多“停机时间”,在您的情况下主要是 RAM。当您的线程正在等待读取或写入完成时,核心将切换到另一个线程。使用超线程,这在某些参数内非常快(就像在相同的程序代码中一样),并且在 IO 和 RAM 中,繁重的进程可以让你看起来真的有 8 个内核而不是 4 个。在你的程序中,你每次运行都会写入一个变量线程,因此您将从实际运行 8 个计算线程中受益匪浅。

有关 HT 的更多信息:https ://en.wikipedia.org/wiki/Hyper-threading

当然,最好的办法就是简单地测试。用 4 个线程测试,用 8 个线程测试。没有明确的“正确”答案。它可能因计算机而异。

于 2013-05-18T15:49:06.450 回答