1

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

4

2 回答 2

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();
}

您需要在包含路径中添加几个目录: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)

于 2011-09-06T20:42:34.213 回答
0

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

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

于 2011-09-08T00:58:00.407 回答