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多线程也会炸:
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]
jxct1oxe1#
-DNCNN_AVX2=OFF -DNCNN_RUNTIME_CPU=OFF 后在debug模式跑,发现是在分配内存的时候炸掉了如果去掉自定义allocator,就不会崩了
ne5o7dgx2#
confirmed
bz4sfanl3#
ncnn2table.cpp 代码中 ncnn::UnlockedPoolAllocator 改为 ncnn::PoolAllocator 能解决吗?
ncnn::UnlockedPoolAllocator
ncnn::PoolAllocator
sr4lhrrt4#
修改后不崩溃了
2w2cym1i5#
验证图片量多起来后还是会崩溃
rekjcdws6#
手写了个allocator直接调用malloc和free,测试集9k+用kl和aciq都没有崩
ssm49v7z7#
调试了一阵子发现修改成PoolAllocator后的崩溃并不是因为多线程读写,而是fastMalloc内部使用的__aligned_malloc分配内存失败的时候返回的是0,并且后续的调用里也没有检查措施然后没有崩溃的几次编译都是直接cmake跑出来的exe,如果用vs打开工程,默认编译的是32位程序,这时候因此只要出现alloc失败,同时totalsize的数值对应的内存偏移是一块未分配内存,就会导致refcount写入失败
r9f1avp58#
这是否表明,并不是多线程问题,只是32位程序内存分配失败了?那么64位程序,使用UnlockedPoolAllocator也能正常不崩溃?
slmsl1lt9#
使用UnlockedPoolAlloocator+64位target的话,在kl和aciq全程都没有问题了,看来的确是32位内存限制的问题。另外eq会在search weight scale阶段崩掉,shapes和listspaths越界:
9条答案
按热度按时间jxct1oxe1#
-DNCNN_AVX2=OFF -DNCNN_RUNTIME_CPU=OFF 后在debug模式跑,发现是在分配内存的时候炸掉了
如果去掉自定义allocator,就不会崩了
ne5o7dgx2#
confirmed
bz4sfanl3#
ncnn2table.cpp 代码中
ncnn::UnlockedPoolAllocator
改为ncnn::PoolAllocator
能解决吗?sr4lhrrt4#
ncnn2table.cpp 代码中
ncnn::UnlockedPoolAllocator
改为ncnn::PoolAllocator
能解决吗?修改后不崩溃了
2w2cym1i5#
ncnn2table.cpp 代码中
ncnn::UnlockedPoolAllocator
改为ncnn::PoolAllocator
能解决吗?验证图片量多起来后还是会崩溃
rekjcdws6#
手写了个allocator直接调用malloc和free,测试集9k+用kl和aciq都没有崩
ssm49v7z7#
调试了一阵子发现修改成PoolAllocator后的崩溃并不是因为多线程读写,而是fastMalloc内部使用的__aligned_malloc分配内存失败的时候返回的是0,并且后续的调用里也没有检查措施
然后没有崩溃的几次编译都是直接cmake跑出来的exe,如果用vs打开工程,默认编译的是32位程序,这时候因此只要出现alloc失败,同时totalsize的数值对应的内存偏移是一块未分配内存,就会导致refcount写入失败
r9f1avp58#
调试了一阵子发现修改成PoolAllocator后的崩溃并不是因为多线程读写,而是fastMalloc内部使用的__aligned_malloc分配内存失败的时候返回的是0,并且后续的调用里也没有检查措施
然后没有崩溃的几次编译都是直接cmake跑出来的exe,如果用vs打开工程,默认编译的是32位程序,这时候因此只要出现alloc失败,同时totalsize的数值对应的内存偏移是一块未分配内存,就会导致refcount写入失败
这是否表明,并不是多线程问题,只是32位程序内存分配失败了?
那么64位程序,使用UnlockedPoolAllocator也能正常不崩溃?
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越界: