多线程求和程序在笔记本比台式机运行更快的原因咨询
多线程求和程序的跨设备性能异常分析
问题概述
编写了一个计算1到n总和的多线程程序,出现反常识的性能结果:
- 搭载Intel i5 1035G7的笔记本,多线程版本运行速度远超性能更强的Ryzen 5 5600G台式机
- 串行版本程序则是台式机运行更快
核心代码结构
struct threadData { unsigned long long *tempResult; long long start; long long end; }; void *calculateTotal(void *arg) { struct threadData *structPtr = (struct threadData *)arg; for (long long i = structPtr->start; i <= structPtr->end; i++) { *(structPtr->tempResult) += i; } pthread_exit(0); } int main(int argc, char *argv[]) { ... int numThreads = atoi(argv[1]); long long input = atoll(argv[2]); struct threadData threadDataArray[numThreads]; unsigned long long result = 0; unsigned long long threadResult[numThreads]; ... pthread_t threads[numThreads]; for (int i = 0; i < numThreads; i++) { threadDataArray[i].start = i * input / (numThreads) + 1; threadDataArray[i].end = (i + 1) * input / (numThreads); threadDataArray[i].tempResult = &threadResult[i]; int threadCreate = pthread_create(&threads[i], NULL, calculateTotal, (void *)&threadDataArray[i]); ... } // 等待所有线程结束 for (int i = 0; i < numThreads; i++) { int threadJoin = pthread_join(threads[i], NULL); ... } // 汇总结果 for (int i = 0; i < numThreads; i++) { result += threadResult[i]; } printf("(running in parallel)\nsum is: %llu\n", result); }
实际运行结果
Intel i5 1035G7笔记本
$ time ./ex2parallel 10 4897582469 (running in parallel) sum is: 11993157022776859215 real 0m9.955s user 1m0.628s sys 0m0.010s
Ryzen 5 5600G台式机
$ time ./ex2parallel 10 4897582469 (running in parallel) sum is: 11993157022776859215 real 0m31.003s user 4m1.410s sys 0m0.011s
原因解析
编译器优化差异
若两台机器的编译参数不同,会直接拉开性能差距。比如笔记本使用了-O2/-O3级别的优化,而台式机用默认的无优化编译(-O0),简单加法循环的优化对这类计算密集型任务的性能影响极大。CPU散热与频率限制
Ryzen 5 5600G标称性能更强,但多线程满载时,若台式机散热能力不足,CPU会触发降频机制,实际运行频率远低于标称值。而i5 1035G7功耗更低,散热压力小,能在多线程场景下维持稳定频率,反而获得更高的实际执行效率。超线程架构的场景适配性
Intel的超线程技术在这类无依赖的简单计算任务中,线程间资源冲突更少,利用率更高;AMD的SMT技术在线程数量接近逻辑核心数时,可能出现更多资源竞争,导致单线程性能下降,整体执行时间变长。操作系统调度开销
不同系统或同系统不同版本的调度策略差异,可能导致台式机在处理10个线程时出现更频繁的线程切换,额外开销增加;而笔记本的调度器更适配该线程数量的分配,切换损耗更小。
内容的提问来源于stack exchange,提问作者Daniel Roussielle
相关产品推荐
相关产品推荐

