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