C++ 超线程性能比较

C++ 超线程性能比较,c++,multithreading,performance,openssl,hyperthreading,C++,Multithreading,Performance,Openssl,Hyperthreading,我写了一个项目,它使用了openssl中的一些基本功能,例如RAND\u bytes和des\u ecb\u encrypt 我的电脑有i7-2600(4核8逻辑CPU)。当我用4个线程运行我的项目时,它将花费10秒。当我用8个线程运行它时,它也需要10秒 我的意思是,超线程并没有给我任何性能改进。在Linux下,实验结果是一致的 我发现,在某些情况下,超线程并不能给我带来一些改进。另外,我发现了一些直观的结果 然而,我尝试编写了一些简单的测试,并找到了一些简单的示例,这些示例将表明超线程不会给

我写了一个项目,它使用了
openssl
中的一些基本功能,例如
RAND\u bytes
des\u ecb\u encrypt

我的电脑有i7-2600(4核8逻辑CPU)。当我用4个线程运行我的项目时,它将花费10秒。当我用8个线程运行它时,它也需要10秒

我的意思是,超线程并没有给我任何性能改进。在Linux下,实验结果是一致的

我发现,在某些情况下,超线程并不能给我带来一些改进。另外,我发现了一些直观的结果

然而,我尝试编写了一些简单的测试,并找到了一些简单的示例,这些示例将表明超线程不会给我带来明显的改进。遗憾的是,我没有找到它


因此,我的问题是,是否有一些
简单的
测试表明超线程不会给我带来任何性能改进。

超线程利用了CPU有许多组件的优势,当一个组件被使用时,当没有超线程时,其他组件就闲置着。您可以尝试编写两种类型的线程,一种执行整数计算(希望使用ALU),另一种执行浮点算术(希望使用FPU)

我自己没有尝试过,但在这种情况下,超线程似乎应该可以提高性能

要显示相反的情况,您只能使用一种类型的线程(要么线程只执行整数操作,要么线程只执行浮点操作)


也可能是您的测试存在缺陷,但为了知道是否存在缺陷,我们需要有关该测试的更多信息。

您可能会发现,对于使用大量内存的代码,超线程有更多帮助,因此处理器在从内存取数时会定期被阻塞

根据我的经验,很难找到“简单代码”显示超读的好处。它往往是更复杂的例子,显示了好处。尽管如此,其好处很可能不是“无超读”的2倍。指望得到20-30%的改善

我写了一个项目,它使用openssl中的一些基本函数,如RAND_字节和des_ecb_加密。。。我的电脑有i7-2600(4核8逻辑CPU)。当我用4个线程运行我的项目时,它将花费10秒。当我用8个线程运行它时,它也需要10秒

当使用
RDRAND
(在这种情况下,
RAND_bytes
将起作用)时,总线将成为限制因素。您的峰值应该在800MB/秒左右。不管有多少线程,总线传输数据的速度都不够快。看

如果您使用AES,那么您可能会看到比DES/3DES观测更快的速度。你的常春藤电桥有AES-NI,它可以达到1.3个周期/字节,这应该是AES软件的两倍或三倍。为确保您使用的是AES-NI指令,您必须使用EVP接口


我发现这里告诉我,在某些情况下,超线程并不能给我带来一些改进。另外,我在这里发现了一些直观的结果

我想@selalerer和@Mats Peterson回答了你的问题。这个问题不是线性扩展的,你会遇到一个最大的加速。英特尔表示,其利润率约为30%

英特尔最新的体系结构支持无序执行,而不是超线程执行,因为它应该更高效。了解Silvermont处理器内核

但是如果你想进行正式的深入研究,那就看一本关于计算机工程的书。这是我在大学学习时用过的书:(现在可能有点过时了)


然而,我尝试编写了一些简单的测试,并找到了一些简单的示例,这些示例将表明超线程不会给我带来明显的改进

OpenSSL还有一个基准测试应用程序。请参阅
/apps/speed.c
中的源代码


此外,基准测试应用程序也有自己的个性。加密压力测试可能不会像您希望看到的那样主要地揭示差异。例如,请参见。

以下是我的Linux和Windows MP基准测试的详细信息和结果,它们的行为可能有所不同。没有太多的HT,但Linux测试包括Atom(1个核心2个线程)和Windows的核心i7结果(4+4)

根据您想要证明HT是否提供更好或更差的性能,您可以选择。以下是RandMem在i7上的结果(Linux使用此测试似乎更好)。对于I7类,您还需要考虑Turbo Boost,因为多线程可能会更低。
             CPUs          MBytes Per Second Using Threads        Gain At Threads
             /HTs         1       2       4       6       8     2     4     6     8
 Serial RD
 Core i7     4/8 L1   11458   22661   37039   43717   46374   2.0   3.2   3.8   4.0
 930             L2   10380   20832   32853   41711   42839   2.0   3.2   4.0   4.1
 #### MHz        L3    8828   17743   29610   38414   40330   2.0   3.4   4.4   4.6
 Win 764        RAM    4266    8712   17347   24946   25589   2.0   4.1   5.8   6.0

 Serial RW
 Core i7     4/8 L1   15282   13724   16240   16209   18379   0.9   1.1   1.1   1.2
 930             L2   12223   18216   25326   28104   27047   1.5   2.1   2.3   2.2
 #### MHz        L3   10234   19266   21931   24450   26351   1.9   2.1   2.4   2.6
 Win 764        RAM    4533    7656   13876   14543   13390   1.7   3.1   3.2   3.0

 Random RD
 Core i7     4/8 L1   11266   22548   38174   45592   47141   2.0   3.4   4.0   4.2
 930             L2    6233   12463   20059   24986   25667   2.0   3.2   4.0   4.1
 #### MHz        L3    3499    6915    9211   10002    9531   2.0   2.6   2.9   2.7
 Win 764        RAM     459     909    1241    1398    1364   2.0   2.7   3.0   3.0

 Random RW
 Core i7     4/8 L1   14375    3027    2780    2901    3297   0.2   0.2   0.2   0.2
 930             L2    5887    4555    6117    6693    7281   0.8   1.0   1.1   1.2
 #### MHz        L3    3104    4604    4721    5047    4933   1.5   1.5   1.6   1.6
 Win 764        RAM     428     860     899     948    1026   2.0   2.1   2.2   2.4

 #### 2.8 GHz running at up to 3.06 GHz via Turbo Boost, dual channel 1066 MHz DDR3 RAM 
然后是显示实际收益的MP Whetstone基准

                      MWIPS  MFLOP  MFLOP  MFLOP   COS    EXP   FIXPT   IF    EQUAL
CPU              MHz            1      2      3    MOPS   MOPS   MOPS   MOPS   MOPS

Core i7 1 Thrd  ####   3115   1065    886    738   79.3   39.7   2447   2936   1154

Core i7 Win7    ####  21690   8676   7621   5844    531    291  16643  12027   5034
Quad Core Thread 1            1091   1027    728   66.4   36.5   2050   1501    629
Plus HT   Thread 2            1089   1037    742   66.0   36.5   2090   1507    630
          Thread 3            1090    946    742   66.8   36.5   2069   1534    631
          Thread 4            1092   1037    727   66.6   36.6   2031   1501    630
          Thread 5            1042    959    736   66.4   36.5   1912   1483    630
          Thread 6            1091    874    723   66.6   36.1   2049   1507    629
          Thread 7            1090    867    725   65.6   36.3   2094   1516    631
          Thread 8            1091    874    722   66.3   36.3   2350   1476    624

Gain %                  696    815    860    792    670    733    680    410    436

使用多线程的性能在很大程度上取决于如何使用线程,以及如何在线程之间同步数据。当您有两个线程时,性能如何?或者只是让程序单线程?@JoachimPileborg它没有任何
同步
。换句话说,每个线程独立计算。即使如此,使用较少的线程(尤其是没有任何额外线程)进行测试始终是一个好主意。如果没有其他问题,您将知道在哪一点添加更多线程没有帮助,以及多线程是否真的有助于您的算法。当指令流完全停止时,例如由于内存访问、分支预测失误或除法操作,超线程更适用。无论是整数操作还是FPU操作本身都可能使指令调度程序非常繁忙,以至于超线程永远不会发生。@selalerer我的项目非常简单。要计算1000个点,当有4个线程时,每个线程需要计算250个点。对于8个线程,每个线程需要计算125个点。(哪个可以称为SIMD?)