- 主题:这种多线程需求如何设计?
伪代码如下:
myfun()
{
mytype a,b,c,d;
getData(a,b);//从数据采集程序的缓存中读取a、b
funA(a,c);//传递a、c的引用,a作为输入,c作为返回值
funB(b,d);//同上
funC(c,d);
}
funA和funB的计算量相同,顺序执行的话共用时约0.3ms。funC的计算量忽略不计。
myfun需要每秒执行4000次,所以顺序执行的速度不够,很快缓存就满了。
我试过openmp section,funA和funB各一个section,在4核CPU上运行时CPU占用翻倍(本来占满一个核,现在占满两个核),但速度没啥变化。
然后用标准库的thread,
myfun()
{
mytype a,b,c,d;
getData(a,b);//从数据采集程序的缓存中读取a、b
auto t=std::thread(funA,std::ref(a),std::ref(c));
funB(b,d);
t.join();
funC(c,d);
}
这样的话,CPU占用没啥变化,速度也没啥变化。猜想可能是因为0.3ms的时间对于线程调度来说太短了。
所以请教各位大佬有没有什么好办法能比较简单的解决?
--
FROM 121.69.95.*
难度不是应该对myfunc并行,每个线程执行1000次吗。
--
FROM 116.230.161.*
每次myfunc的计算结果要按照从缓存中取出数据的顺序进行排列,而且对实时性要求较高,
所以缓存也不大,不能攒一批数据后再并行调用myfunc。
虽然也能达到目的,但要满足上面的限制条件,程序会比较复杂,我只是想问问有没有我没有了解到的能比较简单的解决这个问题的方法。
【 在 Madlee 的大作中提到: 】
: 难度不是应该对myfunc并行,每个线程执行1000次吗。
--
FROM 121.69.95.*
一下方法都可以改进性能:
1.bc开长线程
2.reactx
3.async/await, Task.whenall
【 在 capriccio 的大作中提到: 】
: 每次myfunc的计算结果要按照从缓存中取出数据的顺序进行排列,而且对实时性要求较高,
: 所以缓存也不大,不能攒一批数据后再并行调用myfunc。
: 虽然也能达到目的,但要满足上面的限制条件,程序会比较复杂,我只是想问问有没有我没有了解到的能比较简单的解决这个问题的方法。
: ...................
--
FROM 123.116.207.*
以下
--
FROM 123.116.207.*
没用过openmp,但是看你的描述,openmp 应该已经加速了,否则cpu占用率不会提高。
打出log分析下吧,一次的log不准,就弄1000次的取平均值,要对每一步的效率进行分析,只分析最后的结果是不够的
另外,可以弄四个线程,getData, funcA, funcB, funcC 各忙各的,用通知的方式在各个函数间传递数据计算情况,也能加速
【 在 capriccio 的大作中提到: 】
: 伪代码如下:
: myfun()
: {
: ...................
--
FROM 223.71.135.*
1. github 上有一个 taksflow 可以试试
2. 你为什么每次都要在 myfunc 里创建和销毁线程?执行4000次,就是要创建销毁4000次线程。。弄个固定的线程或者线程池都可以啊
【 在 capriccio 的大作中提到: 】
: 伪代码如下:
: myfun()
: {
: ...................
--
FROM 218.76.62.*
谢谢,我网上搜索研究一下
【 在 leadu 的大作中提到: 】
: 一下方法都可以改进性能:
: 1.bc开长线程
: 2.reactx
: ...................
--
FROM 121.69.95.*
我研究一下taksflow、线程池先
我想过用固定的线程,但是这个线程也需要和主线程同步,需要lock或者条件变量来唤醒(这部分我比较熟了),然后在这次计算完成后和主线程的计算结果同步、合并(这部分我就不大熟了,如果继续用lock和条件变量是不是太繁琐了),也不知道这种方式的反应速度如何。毕竟我在某个地方用sleep,哪怕只睡1ms甚至1us,实际睡的时间都差不多几ms。所以我很怀疑线程的调度速度。
其实往复杂了写,我也能写出来。就是想来问问大家有没有什么我不知道的好用的轮子(语法、标准库、简单的三方库)刚好适用这种需求。
【 在 speedboy2998 的大作中提到: 】
: 1. github 上有一个 taksflow 可以试试
: 2. 你为什么每次都要在 myfunc 里创建和销毁线程?执行4000次,就是要创建销毁4000次线程。。弄个固定的线程或者线程池都可以啊
--
FROM 121.69.95.*
试试folly里面的executor+future,或者boost里面的thread pool。或者直接用标准库的async+future。
【 在 capriccio 的大作中提到: 】
: 伪代码如下:
:
: myfun()
: {
: mytype a,b,c,d;
: getData(a,b);//从数据采集程序的缓存中读取a、b
: funA(a,c);//传递a、c的引用,a作为输入,c作为返回值
: funB(b,d);//同上
: funC
: ..................
发自「今日水木 on iPhone XR」
--
FROM 114.253.34.*