大部分情况下,使用N个线程的速度并不是等量任务单线程的1/N,这里面有很多原因,比如创建线程、线程调度的开销,CPU/核的数量不够多导致N个任务不能完全并行,再或者,其它非任务线程占用CPU。
还有一个不容忽视的原因就是,多个线程更新同一个cache line,导致多个核的缓存同步占用了大量时间。
这是一种隐藏地很深的原因,比如下面我遇到的情况:
首先是一个单线程程序:
#include <stdio.h>
#include <stdlib.h>
unsigned long iteration = 20000000000;
unsigned long* data_array;
int main() {
data_array = (unsigned long*)malloc(sizeof(unsigned long)*1);
*data_array = 0;
while (*data_array < iteration)
(*data_array)++;
free(data_array);
}
它计算20000000000次,它的耗时:
yxc@RealBox:~/Desktop/test$ time ./single
real 0m39.234s
user 0m39.178s
sys 0m0.000s
然后是一个两个线程的多线程版本,每个线程执行1 0000000000计算:

本文探讨了多线程程序中由于缓存对齐问题导致的性能瓶颈。当多个线程更新同一cache line时,缓存同步开销会显著影响效率。通过实例分析,说明了一个未进行Cache Align的多线程程序与单线程程序的性能对比,并解释了time命令的输出含义。最后,介绍了如何使用posix_memalign进行内存对齐以优化多线程程序,以提高性能。
最低0.47元/天 解锁文章
1194

被折叠的 条评论
为什么被折叠?



