Matlab编译cuda的.cu文件

来源:互联网 发布:自动化编程语言 编辑:程序博客网 时间:2024/06/05 00:54

matlab函数,大体首先是用nvcc命令生成.o文件,然后用mex链接对应库文件,生成动态链接库(.mexw64等)。

测试环境:

1) Windows x64 + matlab + cuda 5.5 + vs2012

2) Ubuntu 12.04 amd64 server + matlab + gcc + cuda 5.5

windows用户需要根据自身编译器更改函数第10行,改为cl.exe所在文件夹。

如果第53行出错,请您在matlab中先mex -setup配置编译器。。。

使用方法e.g. 

nvmex('a.cu');


function nvmex(cuFileName)%NVMEX Compiles and links a CUDA file for MATLAB usage% NVMEX(FILENAME) will create a MEX-File (also with the name FILENAME) by% invoking the CUDA compiler, nvcc, and then linking with the MEX% function in MATLAB.if ispc % WindowsHost_Compiler_Location = '-ccbin "C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\x86_amd64"';CUDA_INC_Location = ['"' getenv('CUDA_PATH')  '\include"'];    CUDA_SAMPLES_Location =['"' getenv('NVCUDASAMPLES5_5_ROOT')  '\common\inc"'];    PIC_Option = '';    if ( strcmp(computer('arch'),'win32') ==1)        machine_str = ' --machine 32 ';        CUDA_LIB_Location = ['"' getenv('CUDA_PATH')  '\lib\Win32"'];    elseif  ( strcmp(computer('arch'),'win64') ==1)        machine_str = ' --machine 64 ';        CUDA_LIB_Location = ['"' getenv('CUDA_PATH')  '\lib\x64"'];    endelse % Mac and Linux (assuming gcc is on the path)    CUDA_INC_Location = '/usr/local/cuda/include';    CUDA_SAMPLES_Location = '/usr/local/cuda/samples/common/inc';Host_Compiler_Location = ' ';PIC_Option = ' --compiler-options -fPIC ';    machine_str = [];    if ( strcmp(computer('arch'),'win32') ==1)        CUDA_LIB_Location = '/usr/local/cuda/lib';    elseif  ( strcmp(computer('arch'),'win64') ==1)        CUDA_LIB_Location = '/usr/local/cuda/lib64';    endend% !!! End of things to modify !!![~, filename] = fileparts(cuFileName);nvccCommandLine = [ ...'nvcc --compile ' Host_Compiler_Location ' ' ...'-o '  filename '.o ' ...machine_str PIC_Option ...' -I' '"' matlabroot '/extern/include "' ...' -I' CUDA_INC_Location ' -I' CUDA_SAMPLES_Location ...' "' cuFileName '" '  ];mexCommandLine = ['mex ' filename '.o'  ' -L' CUDA_LIB_Location  ' -lcudart'];disp(nvccCommandLine);warning off;status = system(nvccCommandLine);warning on;if status < 0error 'Error invoking nvcc';enddisp(mexCommandLine);eval(mexCommandLine);end


0 0