在matlab中使用nvmex的问题

时间:2011-09-06 15:56:43

标签: matlab cuda matlab-engine

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

2 个答案:

答案 0 :(得分:2)

在任何最新版本的Matlab或Cuda SDK中都不支持nvmex。相反,我建议在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 Path中添加几个目录:C:\ Program Files \ MATLAB \ R2009a \ extern \ include和CUDA目录。

添加到链接器路径:C:\ Program Files \ MATLAB \ R2009a \ extern \ lib \ win32 \ microsoft,$(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)运行它。

答案 1 :(得分:0)

我建议使用Matlab文件交换中的CUDA mex

它使您能够通过Matlab进行编译。这样可以在Matlab和Visual Studio版本之间获得更好的兼容性,而不是强制您通过Visual Studio明确指定mex依赖项。