我正在使用opencv和cuda对dll进行互操作调用进行单元测试。
单元测试(使用VS 2017 Enterprise中的Microsoft框架)失败,因为opencv中的cuda调用不是线程安全的,或者更可能是多进程安全的。切换到并行或非并行测试无济于事;仅当我分别运行测试(单击鼠标右键,运行测试)才能成功。
如何使单元测试线程安全?还是更安全的多进程?
在本机代码中,我将在函数调用结束时释放cuda资源。并确保了代码线程的安全,但似乎需要使多线程安全。
我尝试使用private static object _lockObj = new object()
和lock(_obj) { //cuda-interop calls }
的组合,但这不会改善结果。
测试失败时的输出类型:
在托管部分:
System.Runtime.InteropServices.SEHException: 'Problem with native part: <External component has thrown an exception.> Error code: 0x80004005 | Name: E_FAIL | Description: Unspecified failure'
在本机部分:
opencv exception :OpenCV(4.0.1-dev) I:\opencv-master\opencv_contrib\modules\cudaoptflow\src\brox.cpp:124: error: (-217:Gpu API call) NCV Assertion Failed: cudaError_t=77, file=I:/opencv-master/opencv_contrib/modules/cudalegacy/src/cuda/NCVBroxOpticalFlow.cu, line=1017 in function 'anonymous-namespace::outputHandler'