AMD SMT或Intel HT性能

问题描述 投票:-2回答:2

我不太明白为什么逻辑处理器加倍的处理器比单个逻辑处理器要贵得多。据我所知,对于6核/ 12线程CPU,在6或12个线程上运行代码没有区别。

正如猴子所问,这是在每个线程上模拟繁重负载的C#示例:

static void Main(string[] args)
    {
        if (IntPtr.Size != 8)
            throw new Exception("use only x64 code, 2020 is coming...");

        //6 for physical cores, 12 for logical cores
        const int limit_threads = 12; 
        const int limit_actions = 256;
        const int limit_loop = 1000 * 1000 * 10;
        const double power = 1.0 / 17.0;

        long result = 0;
        var action = new Action(() =>
        {
            long value = 0;
            for (int i = 0; i < limit_loop; i++)
                value += (long)Math.Pow(i, power);

            Interlocked.Add(ref result, value);
        });

        var actions = Enumerable.Range(0, limit_actions).Select(x => action).ToArray();
        var sw = Stopwatch.StartNew();

        Parallel.Invoke(new ParallelOptions()
        {
            MaxDegreeOfParallelism = limit_threads
        }, actions);

        Console.WriteLine($"done in {sw.Elapsed.TotalSeconds}s\nresult={result}\nlimit_threads={limit_threads}\nlimit_actions={limit_actions}\nlimit_loop={limit_loop}");
    }

6个线程的结果(AMD Ryzen 2600):

done in 13,7074543s
result=5086445312
limit_threads=6
limit_actions=256
limit_loop=10000000

12个​​线程的结果(AMD Ryzen 2600):

done in 11,3992756s
result=5086445312
limit_threads=12
limit_actions=256
limit_loop=10000000

通过使用所有逻辑内核而不是仅使用物理内核,性能大约提高了10%,几乎为空。您现在能说什么?

与仅使用物理内核相比,有人可以提供使用处理器多线程(AMD SMT或英特尔HT)将比宝贵的示例代码更快吗?

c# multithreading cpu
2个回答
1
投票

我认为,取决于SMT / HT技术的可用性来改变处理器的价格只是营销策略的问题。硬件可能在每种情况下都是相同的,但是制造商已禁用某些功能,以提供便宜的型号。

这项技术依赖于这样的事实,即某些微操作可以在一个指令必须等待某些东西被执行;因此,不仅仅是等待,同一核利用其电路在微操作上取得一些进展从另一个线程。从粗略的角度来看,我们可以感知到两个(或更多)的执行某些模型)从两个不同的线程执行的微操作序列在单个硬件上(某些冗余部分除外,例如寄存器...)

这项技术的效率取决于问题。经过各种测试,我发现如果问题是compute bound,即限制因素是计算(加,乘...)所需的时间,但不是内存绑定(数据已经可用,无需等待内存),那么这项技术并没有提供任何好处。这是由于以下事实:没有gap可以填充两个序列微操作,因此两个线程的交织执行不是更好而不是两个独立的串行执行。在完全相反的情况下,当问题是内存绑定而不是compute bound,没有更多的好处,因为两个线程都必须等待来自内存的数据。当问题混合存在时,我才注意到性能有所改善数据访问和计算;在这种情况下,当一个线程正在等待数据时,同一个内核可以在其他线程的计算中取得一些进展,并且反之亦然。


1
投票

TLDR:SMT / HT是一种可以抵消大规模多线程成本的技术,而不是使用更多内核来加快计算速度。

您误解了SMT / HT的功能。

“据我所知,对于6cores-12threads CPU,在6或12个线程上运行代码没有区别。”

如果是这样,则SMT / HT正常工作。

要了解原因,您需要了解现代的OS内核和内核线程。当今的操作系统使用的是抢先线程。

OS内核将每个内核分成称为“ Quantum”的时间片,并使用中断以复杂的循环方式调度各种进程。

我们要看的部分是中断。当安排一个CPU内核切换运行另一个线程时,我们将此过程称为“上下文切换”。上下文切换是昂贵,缓慢的过程,因为必须停止,保存高度流水线化的CPU的整个状态和流,并将其交换出另一种状态(以及其他缓存,寄存器,查找表等)。根据this answer,上下文切换时间以微秒(数千个时钟周期)为单位;并且只会随着CPU变得越来越复杂而变得更糟。

SMT / HT的目的是作弊,通过使每个CPU内核能够同时存储两个状态(想象一下,用两个监视器而不是一个监视器,您一次仍然只使用一个监视器,但是您生产率更高,因为您无需在每次切换任务时都重新排列窗口)。因此,SMT / HT处理器可以使上下文切换必须比非SMT / HT处理器更快。

回到您的示例。如果您在Ryzen 2600上关闭了SMT,然后以12个线程运行相同的工作负载,则您会发现它的执行速度明显慢于6个线程。

此外,请注意,更多线程并不能使事情变得更快。

© www.soinside.com 2019 - 2024. All rights reserved.