我已经在我的系统上安装了 matlab,并且还安装了 CUDA SDK for windows。但是我无法编译任何 .cu 文件。我已将 nvmex 脚本文件包含在 Matlab 安装路径的 bin 目录中。一些身体可以帮助吗?
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)
。
我建议使用Matlab 文件交换中的CUDA mex。
它使您能够通过 Matlab 进行编译。通过不强制您通过 Visual Studio 显式指定 mex 依赖项,这可以在 Matlab 和 Visual Studio 版本之间获得更好的兼容性。