1
AnroZ 9 小时 47 分钟前
step0 干了什么?代码没看到,没办法帮忙分析。
单独开个三个后台线程没什么问题,但每个人都这么想会有问题,应该有资源分配限制吧? |
2
RinGress 9 小时 37 分钟前
没代码不好说。
能想到的是核间通信延迟、cache 命中降低,额外开销切换等方面因素。 |
3
Ainokiseki OP |
4
darklinden 9 小时 26 分钟前
如果你 step0 为了多线程使用做了大内存数据的复制,而单线程时只读/无冲突所以用了同一数据,可能 io 耗时超过计算减少的耗时的吧
|
5
JoeJoeJoe PRO 感觉 op 这个不太适合这么拆分优化.
如果有前后依赖关系的话, 感觉应该把 step0-3 打包起来放在一个线程里面执行, 再来任务的话就再起一个线程执行 step0-3. |
6
MrVito 9 小时 9 分钟前 你试下绑核吧,说不定有奇效
|
7
AnroZ 9 小时 2 分钟前
整体看还行吧,原来执行要花 17.5s ,现在 14s 。
如果你的 step 里涉及到 io 操作的话,测试时间本来就有一定的随机性。 建议,测 100+次,会更好一些 |
8
RinGress 8 小时 51 分钟前
|
9
Building 8 小时 46 分钟前 via iPhone
这个要看多线程任务和访问的数据是不是互相独立的,否则访问时会产生多次拷贝和加锁,相比单线程会更加耗时
|
10
sjkdsfkkfd 7 小时 36 分钟前
需要具体看 step1,2,3 在干啥。通用的来讲,你可以使用自顶向下的微架构分析方法来一层层看问题在什么地方,推荐阅读 《现代 CPU 性能分析与优化》 这本书
|
11
jones2000 6 小时 54 分钟前
设计有问题。 上锁了, 避免用锁。锁很耗时间的。
|
12
minami 6 小时 49 分钟前
不了解你的各个 step 怎么拆分的,但是如果你需要主线程等待所有消费者线程运行结束的话,建议用 openmp/tbb ,别自己写
|
13
Ainokiseki OP |
14
minami 6 小时 39 分钟前
@Ainokiseki #13 不能这么写,你要用事件等。首先你每个子线程间不能有锁,其次你要给每个子线程注册一个完成的事件,然后在主线程用 WaitForMultipleObjects 之类的机制去等所有事件完成
|
15
ivan_wl 6 小时 38 分钟前
后台线程和主线程是不同的 cpu 吗
|
16
chashao 6 小时 25 分钟前
@sjkdsfkkfd 感谢分享这本书
![]() |
17
MrVito 6 小时 20 分钟前
@Ainokiseki task 做完以后是 notify_one 还是 notify_all ?有可能惊群了
|
18
unused 6 小时 12 分钟前
看看是不是 NUMA 的问题,profiling 可以再细一点
|
19
bluearc 4 小时 11 分钟前
@Ainokiseki #3 意思是每次回到 step0 后,线程池中就没有任务了吗?那我觉得这里还可以优化一下(但看描述似乎下一个 step0 必须在上一个 step 执行完成后才能启动?),开一个大的线程池,把 step0 包装一下也扔到线程池里,step 执行完后启动 task2 ,3 的时候传一个回调函数进去,同时设计一个数据结构至少包含一个 atomic<size_t>来同步状态(如果能用 C++20 那可以用 latch ),比如初值为 2 ,task2 ,3 执行完成后就 fetchsub ,再检查值是否为零,如果是 0 就把回调扔到线程池里。
但 step 单线程和多线程下用时增长,倒也没什么思路,不如换个机器测测,或者像上面说的构造多个不同的数据多测几百次统计平均值 |