一个for循环 i=0; //下面采用多线程编程 for(int i; i<1000; i++) a = b + c; } 发现:计算时间并没有任何减少。 请问这是为什么? microsat 发表于 2022-01-04 17:01
你用openmp就可以提速了。前面加一行 #pragma omp parallel for 不过需要循环次数很多才能感觉出来加速。 wdong 发表于 2022-01-04 17:16
多线程也需要你把工作量分成小块啊。如果你有1000块砖,一个工人搬需要一天,你雇了10个狗工人,但是9个不干活,还是只有一个人搬1000块砖,当然不会节省时间。 你这段code如果仅仅加入多线程,没有别的改变,那就是每个线程都loop了1000次,如果增加N个线程,相当于工作量增加了N倍。 iheartnyc 发表于 2022-01-04 17:24
回复 14楼Moscow79的帖子 或者就是你的硬件只有一个core?? Moscow79 发表于 2022-01-04 17:30
对。老式的单cpu的机器。 microsat 发表于 2022-01-04 17:32
回复 18楼microsat的帖子 那当然不能提速啊!因为还是同一个cpu轮流执行这几个thread。多线程加速是针对很多个核的CPU来说的! Moscow79 发表于 2022-01-04 17:34
你这段代码碰到牛逼的编译器,直接就变成a = b + c。 如果b, c 不是volatile 的话。 ted.hanks 发表于 2022-01-04 17:08
我可以这么认为吗? 如果cpu只有2个,那么开大于2个的线程,和2个线程是一样的计算时间。 比如n_thread =3, 和n_thread=2是一样的计算时间,因为cpu只有2个。 microsat 发表于 2022-01-04 17:37
发现:计算时间并没有任何减少。
请问这是为什么?
光看你写的例子,b,c都是循环不变的,循环相关的可以直接被删除 你可以看下.s文件,程序最后优化成啥样了
你用openmp就可以提速了。前面加一行 #pragma omp parallel for 不过需要循环次数很多才能感觉出来加速。
提不了速度。因为这是硬循环。 假设4个线程。每个线程做250个循环,总共1000个循环。
如果1个线程,需要运算的循环数是1000. 如果是4个线程,每个线程运算250个循环,总共还是要运算1000个循环。
因为机器是单cpu,所以4个线程都在这个cpu里运行。所以速度不能提高。
多线程也需要你把工作量分成小块啊。如果你有1000块砖,一个工人搬需要一天,你雇了10个狗工人,但是9个不干活,还是只有一个人搬1000块砖,当然不会节省时间。
你这段code如果仅仅加入多线程,没有别的改变,那就是每个线程都loop了1000次,如果增加N个线程,相当于工作量增加了N倍。
我的意思是把一个1000个循环次数的程序段落,分给4个线程,每个线程循环250次,来完成。
结果,计算时间没变。
那肯定是有race condition,仔细检查一下是不是所有线程都在访问同一块公共变量
或者就是你的硬件只有一个core??
我的说的意思,其实下面这个例子。
假设你的电脑挂载了5个分区。A,B,C,D,E 把A,B,C,D的内容全部拷贝到E。
你如果开4个线程,一个线程拷贝A到E,第4个线程拷贝D到E。 结果,你发现,时间上和你用一个线程一点没省。 因为你的cpu只有1个。
对。老式的单cpu的机器。
那当然不能提速啊!因为还是同一个cpu轮流执行这几个thread。多线程加速是针对很多个核的CPU来说的!
我去,单CPU提毛速,再多的线程也还是只能用那一个CPU,各线程没法并行啊。
我可以这么认为吗? 如果cpu只有2个,那么开大于2个的线程,和2个线程是一样的计算时间。
比如n_thread =3, 和n_thread=2是一样的计算时间,因为cpu只有2个。
re…lz了解一下LICM
不,lz先了解一下OS,memory structure,和kernel吧。学一学assembly,看看编译器是怎么把你的code变成assembly的,还有各种运算/读写的耗时。
我们这样帮忙是治标不治本。
……搞不好还不如俩线程。如果你能保证俩线程各占一个CPU从头跑到尾的话。各线程之间context switch那也是时间成本。