Closed dengly closed 4 years ago
同样遇到这个问题
小模型推荐单线程,跑起来会比较稳定 ...
修改jni 的代码后,发现在java层面上,多个线程同时做人脸检测有了提高,但是 ncnn 设置 set_num_threads 过多依然有问题。
不知道楼主是否使用了绑定核心的接口?8线程不如2线程,是Android多线程非常常见的一种情况。Android需要考虑多核调度,大小核的算力差距很大,即便使用多核,也尽量只使用大核数的线程,比如4+4的核心配比,比较好的设置是4线程,而不是8线程,如果是2+2,则2线程往往比4线程快的多。
我使用4+4的核心手机,仅仅设置4线程也是不如2线程
也遇到了类似的,我是2线程加到4线程几乎没有速度上的改变。。。
同样的问题,用大模型100M左右设置多线程还是比单线程慢
我在Raspberry Pi上测试SSD Mobilenet 目标检测的时候也有这个问题。总共有4个线程,但是3或4个线程和2个线程的速度几乎一样。希望Tecent ncnn能够解决一下这个问题,因为似乎是个普遍的问题。
小模型推荐单线程,跑起来会比较稳定 ...
@nihui 您说的小模型,有没有一个大概量化的东西来说,多小最好用单线程,多大用多线程?这个大小您是讲model的size吗?
我使用4+4的核心手机,仅仅设置4线程也是不如2线程 @dengly 请问您用2线程比单线程快多少? 您用线程的时候,如何选择线程跑在4个大核上还是4个小核上?多谢啦
可以试试把powersave改成2,我在845上测试powersave=2, num_threads=4的时候最快,这时候就是纯纯地用四个大核四个线程在跑
4+4的cpu 在主线程上跑,num_threads=4得到了最好的加速,主线程可以运行在4大核心上? 在子线程上跑,num_threads=1最快,其他设置则非常慢,子线程只能运行在1个大核心上,其余threads被分配到了小核?
solved,new version ncnn code
ncnn::set_cpu_powersave(2);//only big cores ncnn::set_omp_dynamic(0); ncnn::set_omp_num_threads(num_threads);
solved,new version ncnn code
include "cpu.h"
ncnn::set_cpu_powersave(2);//only big cores ncnn::set_omp_dynamic(0); ncnn::set_omp_num_threads(num_threads);
请问,你最终是设置4线程吗?我的机器也是4+4,绑定big core后,还是1线程最快。
@zxj7b80 可以尝试将cpu.cpp中的g_powersave改为默认值2 static int g_powersave = 2;
其他需要注意:
@Pinnh 按照你的方法设置了,应该是设置成功了,因为不同线程数速度是不一样的;4+4的核,线程设置2是最快的;在其他3部手机,也是4+4的配置,但是不同的cpu,也是2线程最快;理论上是不是绑定4个大核是最快的,你测试的时候是几个线程最快呢?
@zxj7b80 你可能没有绑定成功, 我的也是4+4的核心,4线程最快,运行速率和线程数正相关 你的这种情况和我以前遇到的问题很像,也是2线程最快,感觉ncnn里面有bug,这个问题我是解决了,但是其他人在这个问题上不是很稳定
用最新的ncnn版本,应该就没有问题了,如果还有问题可以 reopen issue 继续讨论
经测试发现,ncnn 通过设置 set_num_threads 设置多个线程时,设置到8个线程性能还不如2个线程的性能。而且在java层面上,创建多个线程同时做人脸检测时,性能也不如单个线程做人脸检测。