这两天遇到一个奇怪的问题,测试客户的使用场景,需要用intel的MKL库重新封装一个DLL文件,然后主叫程序中不断的对此DLL进行load/call/free循环,结果每运行到第542次的时候主叫程序就自动退出了,没有任何返回,google搜索相关的问题也没有发现可用信息,最后在intel的论坛上,发现有MKL这个项目,然后附上自己的测试代码,描述清楚问题,看看有没有人回复。我是下班前17点多发布的帖子,到家后8点查看竟然已经有人回复了,回复内容如下:
“对于静态使用MKL的dll,在卸载dll时要释放mkl的内存,方法如下,在DLLMain中添加释放的动作”:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
BOOL WINAPI DllMain(HINSTANCE hInst, DWORD fdwReason, LPVOID lpvReserved) { switch(fdwReason) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: mkl_thread_free_buffers(); //for multithreading break; case DLL_PROCESS_DETACH: if (NULL == lpvReserved) { mkl_free_buffers(); MKLFreeTls(fdwReason); // this one can be omitted if MKL VML/VSL is not used mkl_finalize(); } break; } return TRUE; } |
第二天早早的来到公司,对上述方法进行了测试,不论是单独调用MKL,还是MKL与LDK产品一起使用,都不再出现任何异常,很完美。原帖地址如下:
https://software.intel.com/en-us/forums/intel-math-kernel-library/topic/628273
后记:
--MKL是Math Kernel Library的缩写,需要按照Intel Studio,Intel Studio安装后有30天的免费试用期,如果机子上有vs,会自动安装vs的插件,并且提供了command环境模式,对于简单的测试用例,直接用cl/link编译链接,简单快捷。