超线程性能比较
Hyper-threading Performance Comparison
我写了一个项目,它使用了openssl
中的一些基本函数,如RAND_bytes
和des_ecb_encrypt
。
我的电脑有i7-2600(4核和8逻辑CPU)。当我用4个线程运行我的项目时,它将花费10秒。当我用8个线程运行它时,它也需要10秒。
我的意思是,超线程并没有给我带来任何性能改进。在Linux中,实验结果是相同的。
我发现这里告诉我,过度阅读在某些情况下并没有给我一些改善。此外,我在这里发现了一些直观的结果。
然而,我试着写了一些简单的测试,发现了一些简单例子,这些例子表明超线程不会给我带来明显的改进。遗憾的是,我找不到。
因此,我的问题是,是否有一些simple
测试表明超线程不会给我带来任何性能改进。
您可能会发现,超线程对使用大量内存的代码有更多帮助,因此处理器在从内存获取数据时会经常被阻止。
根据我的经验,很难找到显示超线程好处的"简单代码"。往往是更复杂的例子显示了这种好处。尽管如此,其好处很可能不会是"无超线程"的两倍。指望得到20-30%的改善。
超线程利用了这样一个事实,即CPU有许多组件,当使用其中一个组件时,当没有超线程时,其他组件只是闲置着。您可以尝试编写两种类型的线程,一种执行整数计算(希望使用ALU),另一种执行浮点运算(希望使用FPU)。
我自己没有尝试过,但在这种情况下,超线程应该会提高性能。
若要显示相反的情况,您只能使用一种类型的线程(或者只执行整数运算的线程,或者只执行浮点运算的线程)。
也可能是你的测试有缺陷,但为了知道是否是这样,我们需要更多关于该测试的信息。
我写了一个项目,它使用了openssl中的一些基本函数,如RAND_bytes和des_ecb_encrypt。。。我的电脑有i7-2600(4核和8逻辑CPU)。当我用4个线程运行我的项目时,它将花费10秒。当我用8个线程运行它时,它也需要10秒。
当使用RDRAND
(在这种情况下RAND_bytes
会这样做)时,总线是限制因素。您的峰值应该在800MB/秒左右。有多少线程并不重要——总线无法足够快地传输数据。请参阅重新访问的英特尔rdrand指令。
如果你使用AES,那么你可能会看到比DES/3DES观测更好的加速。你的Ivy Bridge有AES-NI
,它可以实现几乎1.3个周期/字节,这应该是大约两个或三个AES软件。为了确保使用AES-NI
指令,必须使用EVP_*
接口。
我在这里发现告诉我,在某些情况下,过度阅读并不能给我带来一些改善。此外,我在这里发现了一些直观的结果。
我想@sellarer和@Mats-Petersson回答了你的问题。这个问题不是线性的,你会遇到最大的加速。英特尔表示其持股比例约为30%。
英特尔最新的体系结构倾向于无序执行,而不是超线程执行,因为它应该更高效。阅读有关Silvermont处理器核心的信息。
但如果你想正式深入研究,那就去看一本关于计算机工程的书。这是我在大学学习时我们用过的一本书:《计算机组织与设计》(现在可能有点过时了)。
然而,我尝试写一些简单的测试,发现了一些简单的例子,这些例子表明超线程不会给我带来明显的改进。
OpenSSL还有一个基准测试应用程序。请参阅<openssl source>/apps/speed.c
中的源代码。
此外,基准测试应用程序也有自己的个性。加密压力测试可能不会像你希望看到的那样主要揭示差异。例如,请参见基准测试工具。
以下是我的Linux和Windows MP基准测试的详细信息和结果,它们的行为可能有所不同。HT不多,但Linux测试包括Atom(1核2线程)和Windows的core i7结果(4+4)。
http://www.roylongbottom.org.uk/linux%20multithreading%20benchmarks.htm
http://www.roylongbottom.org.uk/quad%20core%208%20thread.htm
根据您想要证明HT提供更好还是更差的性能,您可以选择。以下是i7上的RandMem结果(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
- 为什么constexpr的性能比正常表达式差
- QStringList vs list<shared_ptr<QString>> 性能比较C++
- 如何比较两个函数的速度和性能
- 在现代C++中,侵入式容器是否仍然比非侵入式容器具有性能优势?
- 通过默认复制构造函数比较 C++ 字符串是否会影响性能,原因为何?
- 每个编译器的C++性能,比C#慢200倍
- 性能比较:f(std::string&&) vs f(T&&)
- 通过查看程序集来比较按值传递与按引用传递性能
- C++ STL 双链表性能比较
- C++多线程性能比单线程代码慢
- 多线程功能性能比单线螺纹差
- 为什么 std::make_shared<>() 的性能比 boost::make_shared() 好得多?
- 为什么预分配的函数指针的性能比分支差
- 比较float比double更有效吗
- "!="比较运算符比">"快吗?
- 放炮的性能比先放炮后复核的性能差
- 为什么我的散点代码的性能比Vc SIMD更好
- 为什么 C++ fseek/fread 的性能比 C# FileStream 的 Seek/Read 高几倍
- 使用Eigen的性能比使用我自己的类更差
- OpenMP C++并行性能比八核集群更好的双核笔记本电脑