Win10+CUDA10.1+VS2017环境下REShAPE的MEX编译报错求助
解决MinGW-w64编译MEX时tmmintrin.h内置函数未声明的问题
问题根源
你遇到的是MinGW-w64对SSE3指令集内置函数的支持问题,__builtin_ia32_phaddw128这类函数属于SSE3指令集范畴,要么是编译器没开启对应指令集,要么是MinGW版本和CUDA/MATLAB的兼容性有问题。
具体解决方案
强制开启SSE3指令集编译
直接修改vl_compilenn脚本里的mex_compile函数(第599行附近),给mex命令加指令集参数:% 在调用mex之前追加编译参数 args = [args, '-CXXFLAGS="$CXXFLAGS -msse3"']; mex(args{:});这样能强制编译器启用SSE3支持,识别对应的内置函数。
更换适配的MinGW-w64版本
MATLAB自带的MinGW可能版本偏旧,试试装个8.1.0版本的MinGW-w64(选posix线程模型、seh异常处理),然后在MATLAB里指定编译器路径:setenv('MW_MINGW64_LOCATION', 'D:\path\to\your\mingw64');之后重新运行编译脚本。
同步CUDA与宿主编译器的参数
在vl_compilenn的配置项里,给nvcc加参数,让它把指令集选项传递给MinGW:opts.nvccFlags = {'-Xcompiler "-msse3"'};确保nvcc和MinGW的编译参数对齐,避免兼容性冲突。
临时修改tmmintrin.h兼容代码
如果上面的方法都不行,直接改MinGW安装目录里的tmmintrin.h文件,在报错的函数前加兼容宏:#ifndef __builtin_ia32_phaddw128 #define __builtin_ia32_phaddw128(a,b) _mm_hadd_epi16(a,b) #endif其他未声明的
__builtin_ia32_*函数也可以用对应的MMX/SSE intrinsics宏替换,比如_mm_hadd_epi32对应__builtin_ia32_phaddd128。
内容的提问来源于stack exchange,提问作者Reesh
相关产品推荐
相关产品推荐

