TianZerL / Anime4KCPP

A high performance anime upscaler
GNU General Public License v3.0
1.82k stars 139 forks source link

当要处理的图片文件夹位于 Direct-IO 内存盘中时, 会提示"weakly_canonical: 函数不正确" #69

Closed AaronFeng753 closed 3 years ago

AaronFeng753 commented 3 years ago

使用最新的release, 命令行模式, 处理图片文件夹时, 如果图片文件夹位于imdisk建立的内存盘, 就会提示

weakly_canonical: 函数不正确

如果将图片文件夹移动到其他盘符中, 就可以正常处理了, 其他参数全都不用变

内存盘没有任何权限限制, 其他软件都可以和访问正常硬盘一样访问内存盘

AaronFeng753 commented 3 years ago

后来发现不是盘符问题, 是压根无法访问imdisk建立的NTFS内存盘, 不清楚什么情况了, 这个内存盘其他软件都能正常访问的, 没有权限限制

TianZerL commented 3 years ago

处理单个文件呢?

AaronFeng753 commented 3 years ago

处理单个文件呢?

我有个回复没发出去, 我上网搜索了一下, 这个错误其他软件也可能有, 是因为内存盘属于Direct-IO硬盘, 所以部分软件(包括anime4kcpp)无法访问, 应该是访问文件实现的问题

AaronFeng753 commented 3 years ago

处理单个文件呢?

单个文件(内存盘中的)可以正常处理

AaronFeng753 commented 3 years ago

目前来看应该是访问文件夹这部分代码的问题, 如果访问文件夹不是在SCSI实体硬盘中就访问不了

TianZerL commented 3 years ago

处理文件夹使用了filesystem::relative()以保证文件夹结构,而c++ wiki提到The function weakly_canonical() was introduced to simplify operational semantics of relative().,所以就有了这个问题。weakly_canonical()主要是用来把路径标准化的。

AaronFeng753 commented 3 years ago

刚才搜到一个关于这个问题的文章, 忘收藏了, 大致意思是部分软件访问文件时, 会期待文件所在位置是一个能在系统磁盘管理器中可见的实体硬盘分区, 而imdisk创建的Direct-IO硬盘在磁盘管理器中不可见, 所以无法访问

AaronFeng753 commented 3 years ago

可能是你用的这个处理文件夹使用了 filesystem::relative()的问题, QT(C++)上没有遇到这些问题, 可以正常访问Direct-IO内存盘

AaronFeng753 commented 3 years ago

这是imdisk的官网, 如果您想要做一些测试的话可以下载试试, 有GUI, 建立内存盘很方便 https://sourceforge.net/projects/imdisk-toolkit/

TianZerL commented 3 years ago

修好了

AaronFeng753 commented 3 years ago

谢谢! 真快!

0

AaronFeng753 commented 3 years ago

您最近有计划更新release吗? 如果没有, 我就自己编译了

TianZerL commented 3 years ago

您先自己编译吧,我最近考试加实习呢😂。估计七月末才会发release。

AaronFeng753 commented 3 years ago

您先自己编译吧,我最近考试加实习呢😂。估计七月末才会发release。

加油! 祝您考试顺利得高分!

AaronFeng753 commented 3 years ago

编译成功了, 可以访问内存盘了 顺便问一下, 编译时如果没启用TBB会对性能有影响吗? @TianZerL

TianZerL commented 3 years ago

没有影响,ppl openmp tbb性能差别不大,属于互有胜负吧,vs编译就用ppl就行了。自带的不依赖外部库的并行实现可能损失30%吧,因为用的最朴素的线程池模型。

AaronFeng753 commented 3 years ago

没有影响,ppl openmp tbb性能差别不大,属于互有胜负吧,vs编译就用ppl就行了。自带的不依赖外部库的并行实现可能损失30%吧,因为用的最朴素的线程池模型。

谢谢您

TianZerL commented 3 years ago

提升性能建议cmake开这个Ryzen_Optimization,锐龙打鸡血,但intel有可能负优化。

AaronFeng753 commented 3 years ago

提升性能建议cmake开这个Ryzen_Optimization,锐龙打鸡血,但intel有可能负优化。

谢谢,我自己用的ryzen 5800h,所以编译时顺手就打开了😆

TianZerL commented 3 years ago

intel打鸡血可以用Enable_OpenCV_DNN,对锐龙有效,但不如锐龙优化选项,需要外部读取模型。

AaronFeng753 commented 3 years ago

intel打鸡血可以用Enable_OpenCV_DNN,对锐龙有效,但不如锐龙优化选项,需要外部读取模型。

请问编译以后这个外部模型在哪?

TianZerL commented 3 years ago

.\models,把源码的core里models文件夹复制就行。用的相对目录,需要考虑工作目录问题。

AaronFeng753 commented 3 years ago

.\models,把源码的core里models文件夹复制就行。用的相对目录,需要考虑工作目录问题。

起飞了,5800h比RTX 3060快(单个图片

TianZerL commented 3 years ago

其实是因为cuda单图片计算时间会包括jit的时间,不是很准,可以参考OpenCL的时间,或者用-B跑个分才是实际性能。2600开锐龙优化后实时跑个480p视频2x acnet是没问题的。