ncnn2table在线程数多的时候大概率会崩溃?

nxowjjhe  于 4个月前  发布在  其他
关注(0)|答案(9)|浏览(121)

ncnn2table.exe model.param model.bin path.txt model.table shape=[512,512,3] pixel=RGB thread=16 mean=[123,117,104] norm=[0.017,0.017,0.017]
thread=1则不会崩
版本:ncnn-20210525-windows-vs2019-shared
试了下ubuntu16多线程也会炸:

jxct1oxe

jxct1oxe1#

-DNCNN_AVX2=OFF -DNCNN_RUNTIME_CPU=OFF 后在debug模式跑,发现是在分配内存的时候炸掉了
如果去掉自定义allocator,就不会崩了

bz4sfanl

bz4sfanl3#

ncnn2table.cpp 代码中 ncnn::UnlockedPoolAllocator 改为 ncnn::PoolAllocator 能解决吗?

sr4lhrrt

sr4lhrrt4#

ncnn2table.cpp 代码中 ncnn::UnlockedPoolAllocator 改为 ncnn::PoolAllocator 能解决吗?

修改后不崩溃了

2w2cym1i

2w2cym1i5#

ncnn2table.cpp 代码中 ncnn::UnlockedPoolAllocator 改为 ncnn::PoolAllocator 能解决吗?

验证图片量多起来后还是会崩溃

rekjcdws

rekjcdws6#

手写了个allocator直接调用malloc和free,测试集9k+用kl和aciq都没有崩

ssm49v7z

ssm49v7z7#

调试了一阵子发现修改成PoolAllocator后的崩溃并不是因为多线程读写,而是fastMalloc内部使用的__aligned_malloc分配内存失败的时候返回的是0,并且后续的调用里也没有检查措施
然后没有崩溃的几次编译都是直接cmake跑出来的exe,如果用vs打开工程,默认编译的是32位程序,这时候因此只要出现alloc失败,同时totalsize的数值对应的内存偏移是一块未分配内存,就会导致refcount写入失败

r9f1avp5

r9f1avp58#

调试了一阵子发现修改成PoolAllocator后的崩溃并不是因为多线程读写,而是fastMalloc内部使用的__aligned_malloc分配内存失败的时候返回的是0,并且后续的调用里也没有检查措施
然后没有崩溃的几次编译都是直接cmake跑出来的exe,如果用vs打开工程,默认编译的是32位程序,这时候因此只要出现alloc失败,同时totalsize的数值对应的内存偏移是一块未分配内存,就会导致refcount写入失败

这是否表明,并不是多线程问题,只是32位程序内存分配失败了?
那么64位程序,使用UnlockedPoolAllocator也能正常不崩溃?

slmsl1lt

slmsl1lt9#

调试了一阵子发现修改成PoolAllocator后的崩溃并不是因为多线程读写,而是fastMalloc内部使用的__aligned_malloc分配内存失败的时候返回的是0,并且后续的调用里也没有检查措施
然后没有崩溃的几次编译都是直接cmake跑出来的exe,如果用vs打开工程,默认编译的是32位程序,这时候因此只要出现alloc失败,同时totalsize的数值对应的内存偏移是一块未分配内存,就会导致refcount写入失败

这是否表明,并不是多线程问题,只是32位程序内存分配失败了?
那么64位程序,使用UnlockedPoolAllocator也能正常不崩溃?

使用UnlockedPoolAlloocator+64位target的话,在kl和aciq全程都没有问题了,看来的确是32位内存限制的问题。
另外eq会在search weight scale阶段崩掉,shapes和listspaths越界:

相关问题