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?)