我已经在我的系统上安装了matlab,并且还安装了Windows的CUDA SDK。但是我无法编译任何.cu文件。我已将nvmex脚本文件包含在Matlab安装路径的bin目录中。一些身体可以帮助吗?nvmex在matlab中的问题
回答
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)
来运行它。
我会建议使用CUDA mex从Matlab文件交换。
它使您可以通过Matlab编译。通过不强制你通过Visual Studio显式指定mex依赖关系,这可以在Matlab和Visual Studio版本之间获得更好的兼容性。
“CUDA mex”实际上只是nvmex的重新实施。我不同意它具有“更好的兼容性” - 无论您想明确指出它,Cuda运行时依赖项都存在。你仍然需要将.mexw32文件的cudart32_40_17.dll文件分发给其他计算机,否则它将无法运行或者Matlab会崩溃。 – user244795
当然,但对于我最近版本的Matlab(R2010b和R2011a)来说,它效果很好。重新编译比在VS解决方案中更改mexversion.rc更容易。 – peakxu
- 1. 问题在MATLAB
- 2. 在Matlab中绘制问题
- 3. 在Matlab中绘制问题
- 4. 问题上在Matlab
- 5. 问题与Matlab中
- 6. 问题在输出太多的matlab中
- 7. 在matlab中erf/erfc函数的问题
- 8. 网(...)问题Matlab的
- 9. MATLAB的sinc问题
- 10. DWT的Matlab问题
- 11. Matlab nchoosek问题
- 12. 问题与MATLAB
- 13. MATLAB问题
- 14. 解析问题在MATLAB
- 15. Matlab eval在简单的matlab脚本中遇到问题
- 16. 在MATLAB中铸造问题C/MEX
- 17. 问题在MATLAB中使用imfill命令
- 18. MATLAB索引问题
- 19. MATLAB编码问题
- 20. 引擎Matlab问题
- 21. NACA Airfoil Matlab问题
- 22. MATLAB矩阵问题
- 23. Matlab引擎问题
- 24. MATLAB的性能问题
- 25. 在matlab上集成的问题
- 26. matlab中的块匹配问题
- 27. C和Matlab中的浮点问题
- 28. MATLAB环路索引问题
- 29. MATLAB parfor切片问题?
- 30. Matlab子类化问题
我的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
nvmex在Matlab 2010a中不受支持。您必须改为创建一个DLL。在Visual Studio中:文件 - >新建 - >项目。选择Win32。选择应用程序类型 - > DLL。 – user244795