2011-09-06 58 views
1

我已经在我的系统上安装了matlab,并且还安装了Windows的CUDA SDK。但是我无法编译任何.cu文件。我已将nvmex脚本文件包含在Matlab安装路径的bin目录中。一些身体可以帮助吗?nvmex在matlab中的问题

回答

2

nvmex在Matlab或Cuda SDK的最新版本中并不真正支持。相反,我会建议在Visual Studio中编写一个简单的DLL,它使用标准的MEX界面来运行Cuda。我将假设你的项目名为“addAtoB”,并且你只是想将两个数字加在一起,以使示例更简单。

当您安装Cuda SDK时,您需要告诉它将CUDA自定义生成规则添加到Visual Studio,以便它知道如何编译.CU文件。

你的主要CPP应该是这个样子:

// addAtoB.cpp 
#include <mex.h> 
#include <cuda.h> 
#include <driver_types.h> 
#include <cuda_runtime_api.h> 

#pragma comment(lib,"libmx.lib") // link with the Matlab MEX API 
#pragma comment(lib,"libmex.lib") 
#pragma comment(lib,"cudart.lib") // link with CUDA 

// forward declare the function in the .cu file 
void runMyCUDAKernel(void); 

// input and output variables for the function in the .cu file 
float A, B, C; 

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) 
{ 
    A = (float) mxGetScalar(prhs[0]); 
    B = (float) mxGetScalar(prhs[1]); 

    runMyCUDAKernel(); 

    // allocate output 
    nlhs = 1; 
    plhs[0] = mxCreateDoubleScalar(C); 

    mexPrintf("GPU: %f + %f = %f\nCPU: %f", A, B, C, A+B); 

    cudaDeviceReset(); 
} 

您需要添加几个目录include路径:C:\ Program Files文件\ MATLAB \ R2009a \ EXTERN \包括和CUDA目录。

添加到您的链接路径:C:\ Program Files文件\ MATLAB \ R2009a \ EXTERN \ LIB \ WIN32 \微软,$(CUDA_PATH)\ LIB \ $(PlatformName)

接下来,添加一个DEF文件你的项目,它看起来是这样的:

LIBRARY "addAtoB" 
EXPORTS 
    mexFunction 

接下来,创建一个在当前目录下名为runMyCUDAKernel.cu的内容是这样的文件,类型,然后将文件添加到您的项目:

// runMyCUDAKernel.cu: 
#include <cuda.h> 
extern float A, B, C; 

// Device kernel 
__global__ void addAtoB(float A1, float B1, float* C1) 
{ 
    *C1 = A1+B1; 
} 

void runMyCUDAKernel(void) 
{ 
    float* pOutput; 
    cudaMalloc((void**) &pOutput, 1*sizeof(float)); 
    dim3 dimBlock(1, 1); 
    dim3 dimGrid(1, 1); 

    addAtoB<<< dimGrid, dimBlock >>>(A, B, pOutput); 

    cudaMemcpy(&C, pOutput, 1*sizeof(float), cudaMemcpyDeviceToHost); 
    cudaDeviceSynchronize(); 
    cudaFree(pOutput); 
} 

生成DLL并将其从.dll重命名为.mexw32(或.mexw64,如果您使用的是64位Matlab)。那么你应该可以用命令addAtoB(1, 2)来运行它。

+0

我的matlab版本是R2010a,而Microsoft Visual Studio的版本是2008.我将nvmexopts.bat文件复制到我的matlab安装路径的buin目录中,并且当我运行链接中提供的示例时:http://developer.download。 nvidia.com/compute/cuda/1_1/Matlab_CUDA-1.1a.zip,我得到以下错误:在C:\ Program Files \ MATLAB \ R2010a \ bin \ nvmex.pl 728行调用未定义的子程序和main :: uuidgen。 ???错误使用==> nvmex at 206 无法成功完成。 – balazar

+0

nvmex在Matlab 2010a中不受支持。您必须改为创建一个DLL。在Visual Studio中:文件 - >新建 - >项目。选择Win32。选择应用程序类型 - > DLL。 – user244795

0

我会建议使用CUDA mex从Matlab文件交换。

它使您可以通过Matlab编译。通过不强制你通过Visual Studio显式指定mex依赖关系,这可以在Matlab和Visual Studio版本之间获得更好的兼容性。

+0

“CUDA mex”实际上只是nvmex的重新实施。我不同意它具有“更好的兼容性” - 无论您想明确指出它,Cuda运行时依赖项都存在。你仍然需要将.mexw32文件的cudart32_40_17.dll文件分发给其他计算机,否则它将无法运行或者Matlab会崩溃。 – user244795

+0

当然,但对于我最近版本的Matlab(R2010b和R2011a)来说,它效果很好。重新编译比在VS解决方案中更改mexversion.rc更容易。 – peakxu