Matlab 2013a + MEX C程序

时间:2014-12-22 20:11:07

标签: c++ matlab visual-studio-2013

我正在尝试运行一个实现kmeans的程序,可以从matlab2013a调用。但是,我在这些上面得到了未解决的外部符号..

Error   10  error LNK2001: unresolved external symbol _mxCreateNumericMatrix_730    D:\Users\VinayB\Documents\Visual Studio 2013\Projects\kmeans_ba\kmeans_ba\kmeans_serial.obj kmeans_ba

Error   11  error LNK2001: unresolved external symbol _mxGetData    D:\Users\VinayB\Documents\Visual Studio 2013\Projects\kmeans_ba\kmeans_ba\kmeans_serial.obj kmeans_ba

Error   12  error LNK2001: unresolved external symbol _mxGetN   D:\Users\VinayB\Documents\Visual Studio 2013\Projects\kmeans_ba\kmeans_ba\kmeans_serial.obj kmeans_ba

Error   13  error LNK2001: unresolved external symbol _mxGetPr  D:\Users\VinayB\Documents\Visual Studio 2013\Projects\kmeans_ba\kmeans_ba\kmeans_serial.obj kmeans_ba

Error   14  error LNK2001: unresolved external symbol _mexPrintf    D:\Users\VinayB\Documents\Visual Studio 2013\Projects\kmeans_ba\kmeans_ba\kmeans_serial.obj kmeans_ba

Error   15  error LNK2001: unresolved external symbol _mxGetM   D:\Users\VinayB\Documents\Visual Studio 2013\Projects\kmeans_ba\kmeans_ba\kmeans_serial.obj kmeans_ba

我已经包含了相应的include目录和lib文件..

图书馆目录

\的extern \ lib中\ Win64的\微软 \的extern \ lib中\ WIN32 \微软

包含目录

<matlab dir>\extern\include
<matlab dir>\extern\include\win64

其他依赖性

cudart.lib
kernel32.lib
user32.lib
gdi32.lib
winspool.lib
comdlg32.lib
advapi32.lib
shell32.lib
ole32.lib
oleaut32.lib
uuid.lib
odbc32.lib
odbccp32.lib
libemlrt.lib
libeng.lib
libfixedpoint.lib
libmat.lib
libmex.lib
libmwblas.lib
libmwblascompat32.lib
libmwcgir_construct.lib
libmwimreconstruct.lib
libmwimregionalmax.lib
libmwippreconstruct.lib
libmwlapack.lib
libmwmathutil.lib
libmwrtiostreamutils.lib
libmwservices.lib
libmwsilpilprofiling.lib
libmwslexec_parallel.lib
libmwsl_fileio.lib
libmwsl_solver_rtw.lib
libmx.lib
libut.lib
mclbase.lib
mclcommain.lib
mclmcr.lib
mclmcrrt.lib
mclxlmain.lib
ne_mli.lib
ne_rtl.lib
physmod_common_foundation_core_util.lib
rtwcg.lib
SimulinkBlock.lib

1 个答案:

答案 0 :(得分:1)

所以这里是使用VS2013使用CudaToolkit NVCC和MEX DLL为Windows 8 x64构建此类所需的所有包含路径和库依赖项的列表

包括:

C:\ Program Files \ MATLAB \ R2014b \ extern \ include; $(IncludePath) %(AdditionalIncludeDirectories)$(CudaToolkitIncludeDir)

利布斯:

C:\ Program Files \ MATLAB \ R2014b \ extern \ lib \ win64 \ microsoft
$(CudaToolkitLibDir)

libmx.lib libmat.lib libmex.lib cublas.lib cuda.lib cudart.lib cufft.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32。 lib uuid.lib odbc32.lib odbccp32.lib

正确使用VS正确设置NVCC非常费力,我开始使用Nsight Visual Studio CUDA向量示例,并根据makefile手动添加了lib。除了-largeArrayDims之外,它指示编译器使用64位寻址。使用64位库时,默认选择此选项。删除Win32和Debug配置后,我使用Release x64配置来编译MEX文件。

基本上有两个主要项目 cudaKmeans (使用.cu)&amp;正常编译 kmeans_serial (使用.c),然后使用-D TIMEONLY预处理程序指令编译其他计时代码。这意味着我们需要总共4个构建项目 cudaKmeans_Timedemo &amp; kmeans_serial_Timedemo 也。我在这4个项目中使用4个目录在bin目录中生成4个mex文件(带有4个def文件),并在主目录中生成解决方案文件(用于构建所有这些项目)。

cudaKmeans的测试结果: cudaKmeans

cuda对c的收益: cgains 请注意,由于内存开销,没有增益。使用CUDA时,具有C优化的CPU预取器不会产生明显的增益。 CPU是具有大量缓存的服务器类Xeon E5,这就是结果显示CPU更快的原因。我使用的是860GTX。

以下是针对Matlab的收益: matlab gains

相当混合的包。说实话,时机似乎没有了。由于在Windows下解决时间的方式,有点随机。测试代码使用垃圾通用计时器而不是RDTSC,所以我不会太担心。

Herehere是修改后的代码和VS解决方案的链接。我将CudaToolkit 6.5和MATLAB2014b用于项目,但将其更改为不同的MATLAB ver应该非常简单。请注意,在项目中我选择了3.0作为CUDA arch(默认值为2.0)。如果您的GPU的计算分数<&lt;可能需要更改它。 3.0。这个库和测试代码有点儿麻烦,看起来不像“生产质量”。您可能最好使用并行计算工具箱加速的Matlab加法器或this或最好this