我正在尝试运行一个实现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
答案 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的测试结果:
cuda对c的收益: 请注意,由于内存开销,没有增益。使用CUDA时,具有C优化的CPU预取器不会产生明显的增益。 CPU是具有大量缓存的服务器类Xeon E5,这就是结果显示CPU更快的原因。我使用的是860GTX。
以下是针对Matlab的收益:
相当混合的包。说实话,时机似乎没有了。由于在Windows下解决时间的方式,有点随机。测试代码使用垃圾通用计时器而不是RDTSC,所以我不会太担心。
Here或here是修改后的代码和VS解决方案的链接。我将CudaToolkit 6.5和MATLAB2014b用于项目,但将其更改为不同的MATLAB ver应该非常简单。请注意,在项目中我选择了3.0作为CUDA arch(默认值为2.0)。如果您的GPU的计算分数<&lt;可能需要更改它。 3.0。这个库和测试代码有点儿麻烦,看起来不像“生产质量”。您可能最好使用并行计算工具箱加速的Matlab加法器或this或最好this