歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Matlab編譯cuda的.cu文件

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 % Windows
 
 Host_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"'];
    end
else % 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';
    end
end
% !!! 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 < 0
 error 'Error invoking nvcc';
end
disp(mexCommandLine);
eval(mexCommandLine);
end

Copyright © Linux教程網 All Rights Reserved