Matlab and CUDA

Давеча попробовал на своём ноутбуке воспользоваться технологией CUDA.
Ниже опишу, какие ошибки возникали при установки и компиляции. Ошибки распишу более подробно, т.к. самому пришлось их править ища или изобретая варианты устранения. Надеюсь поисковики часто индексируют этот сайт, мне долго приходилось выискивать как устранить ту или иную проблему.
Ноутбук Dell Inspiron 1525:

  • Processor: Intel® Coreâ„¢DuoCPU T5450 1,67 GHz;
  • Memory (RAM): 2,00 GB;
  • Display adapters: NVIDIA GeForce 8400M GS
    Система: Windows Vista Home Basic.
    Версия матлаба: Matlab Version 7.5.0.342 (R2007b)
    В качестве C++ компилятора использовал MS Visual Studio и набор библиотек MS Windows SDK v6.0A.
  1. Установил CUDA, предварительно скачав с сайта NVIDIA всё необходимое http://www.nvidia.ru/object/cuda_get_ru.html (взял версию 2.2, потому как 2.3 не прошла):
  • CUDA Driver: NVIDIA Notebook Driver for Windows Vista 32-bit 185.85
  • CUDA Toolkit: CUDA Toolkit 2.2 for Windows Vista 32-bit
  • CUDA SDK: CUDA SDK 2.2 code samples for Windows Vista 32-bit
  1. Скачал набор для знакомства работы CUDA в среде (вернее со средой) Matlab Matlab_CUDA-1.1a http://developer.nvidia.com/object/matlab_cuda.html
  2. Внутри Matlab_CUDA-1.1a есть файл README.txt с описанием установки пакета и работы того что есть. Описание, как оказалось, неполное и требуются некоторые промежуточные действия. Опишу более:
    Копируем из папки bin файл nvmex.pl в директорию папки с bin-файлами Матлаба F:\Program Files\MATLAB\R2007b\bin
    Включаем пакет mex и действуем подобно ниже описанному:

mex –setup
Please choose your compiler for building external interface (MEX) files:

Would you like mex to locate installed compilers [y]/n? n

Select a compiler:
[1] Borland C++ Compiler (free command line tools) 5.5
[2] Borland C++Builder 6.0
[3] Borland C++Builder 5.0
[4] Compaq Visual Fortran 6.1
[5] Compaq Visual Fortran 6.6
[6] Intel C++ 9.1 (with Microsoft Visual C++ 2005 linker)
[7] Intel Visual Fortran 9.1 (with Microsoft Visual C++ 2005 linker)
[8] Intel Visual Fortran 9.0 (with Microsoft Visual C++ 2005 linker)
[9] Intel Visual Fortran 9.0 (with Microsoft Visual C++ .NET 2003 linker)
[10] Lcc-win32 C 2.4.1
[11] Microsoft Visual C++ 6.0
[12] Microsoft Visual C++ .NET 2003
[13] Microsoft Visual C++ 2005
[14] Microsoft Visual C++ 2005 Express Edition
[15] Open WATCOM C++ 1.3

[0] None

Compiler: 13

The default location for Microsoft Visual C++ 2005 compilers is C:\Program Files\Microsoft Visual Studio 8,
but that directory does not exist on this machine.

Use C:\Program Files\Microsoft Visual Studio 8 anyway [y]/n? n
Please enter the location of your compiler: [C:\Program Files\Microsoft Visual Studio 8] F:\Program Files\Microsoft Visual Studio 9.0

Please verify your choices:

Compiler: Microsoft Visual C++ 2005
Location: F:\Program Files\Microsoft Visual Studio 9.0

Are these correct?([y]/n): y



Warning: MEX-files generated using Microsoft Visual C++ 2005 require
that Microsoft Visual Studio 2005 run-time libraries be
available on the computer they are run on.
If you plan to redistribute your MEX-files to other MATLAB
users, be sure that they have the run-time libraries.
You can find more information about this at:
http://www.mathworks.com/support/solutions…a/1-2223MW.html



Trying to update options file: C:\Users\Illuminati\AppData\Roaming\MathWorks\MATLAB\R2007b\mexopts.bat
From template: F:\PROGRA~1\MATLAB\R2007b\bin\win32\mexopts\msvc80opts.bat

Done . . .

     Теперь необходимо изменить файл mexopts.bat находящийся в папке C:\Users\ВашЛогин\AppData\Roaming\MathWorks\MATLAB\R2007b на следующий (иначе ничего не компилится), изменив в нём координаты ваших папок

@echo off
rem MSVC80OPTS.BAT
rem
rem Compile and link options used for building MEX-files
rem using the Microsoft Visual C++ compiler version 8.0
rem
rem Revision: 1.1.10.4 Date: 2006/11/15 14:50:05
rem
rem ************************************************************


rem General parameters
rem ************************************************************


set MATLAB=%MATLAB%
set VS80COMNTOOLS=%VS80COMNTOOLS%
set VSINSTALLDIR=F:\Program Files\Microsoft Visual Studio 9.0
set VCINSTALLDIR=%VSINSTALLDIR%\VC
set WINSDKDIR=C:\Program Files\Microsoft SDKs\Windows\V6.0A
set PATH=%VCINSTALLDIR%\BIN;%WINSDKDIR%\bin;%VSINSTALLDIR%\Common7\IDE;%VSINSTALLDIR%\SDK\v2.0\bin;%VSINSTALLDIR%\Common7\Tools;%VSINSTALLDIR%\Common7\Tools\bin;%VCINSTALLDIR%\VCPackages;%MATLAB_BIN%;%PATH%
set INCLUDE=%VCINSTALLDIR%\ATLMFC\INCLUDE;%VCINSTALLDIR%\INCLUDE;%WINSDKDIR%\INCLUDE;%VSINSTALLDIR%\SDK\v2.0\include;%INCLUDE%
set LIB=%VCINSTALLDIR%\ATLMFC\LIB;%VCINSTALLDIR%\LIB;%WINSDKDIR%\lib;%VSINSTALLDIR%\SDK\v2.0\lib;%MATLAB%\extern\lib\win32;%LIB%
set MW_TARGET_ARCH=win32

rem ************************************************************


rem Compiler parameters
rem ************************************************************


set COMPILER=cl
set COMPFLAGS=/c /Zp8 /GR /W3 /EHs /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /D_SECURE_SCL=0 /DMATLAB_MEX_FILE /nologo
set OPTIMFLAGS=/MD /O2 /Oy- /DNDEBUG
set DEBUGFLAGS=/MD /Zi /Fd"%OUTDIR%%MEX_NAME%%MEX_EXT%.pdb"
set NAME_OBJECT=/Fo

rem ************************************************************


rem Linker parameters
rem ************************************************************


set LIBLOC=%MATLAB%\extern\lib\win32\microsoft
set LINKER=link
set LINKFLAGS=/dll /export:%ENTRYPOINT% /MAP /LIBPATH:"%LIBLOC%" libmx.lib libmex.lib libmat.lib /implib:%LIB_NAME%.x /MACHINE:X86 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
set LINKOPTIMFLAGS=
set LINKDEBUGFLAGS=/DEBUG /PDB:"%OUTDIR%%MEX_NAME%%MEX_EXT%.pdb"
set LINK_FILE=
set LINK_LIB=
set NAME_OUTPUT=/out:"%OUTDIR%%MEX_NAME%%MEX_EXT%"
set RSP_FILE_INDICATOR=@

rem ************************************************************


rem Resource compiler parameters
rem ************************************************************


set RC_COMPILER=rc /fo “%OUTDIR%mexversion.res”
set RC_LINKER=

set POSTLINK_CMDS=del “%OUTDIR%%MEX_NAME%.map”
set POSTLINK_CMDS1=del %LIB_NAME%.x
set POSTLINK_CMDS2=mt -outputresource:"%OUTDIR%%MEX_NAME%%MEX_EXT%";2 -manifest “%OUTDIR%%MEX_NAME%%MEX_EXT%.manifest”
set POSTLINK_CMDS3=del “%OUTDIR%%MEX_NAME%%MEX_EXT%.manifest”

  1. Далее как в README создаем mexw32-файлы для ускорения работы

mex fft2_cuda.c -IF:\CUDA\include -LF:\CUDA\lib -lcudart -lcufft
mex fft2_cuda_sp_dp.c -IF:\CUDA\include -LF:\CUDA\lib -lcudart -lcufft
mex ifft2_cuda.c -IF:\CUDA\include -LF:\CUDA\lib -lcudart –lcufft
speed_fft

Здесь ура!!! Работает!!!

  1. Приступаем ко второй части. Сначала без CUDA

which Szeta
‘D:\Users\Vasiliy\Matlab\CUDA Experience\Matlab_CUDA_1.1\Szeta.m’

tic; FS_2Dturb(128,1,1,1); toc;
CFL =

0.1017

Gsqav =

1.1995

Elapsed time is 22.721960 seconds.

tic; FS_vortex; toc;
ans =

512

Elapsed time is 315.821864 seconds.

  1. Теперь с использованием видеокарты. Заменяем в файле nvmexopts.bat параметры компиляции (осбенное внимание обратите на то, что ‘/Zc:wchar_t-’ на ‘/Zc:wchar_t’, без этого возникает куча ошибок). Мой nvmexopts.bat файл

@echo off
rem MSVC80OPTS.BAT
rem
rem Compile and link options used for building MEX-files
rem using the Microsoft Visual C++ compiler version 8.0
rem
rem Revision: 1.1.10.2 Date: 2006/06/23 19:04:53
rem
rem ************************************************************


rem General parameters
rem ************************************************************


set MATLAB=%MATLAB%
set VS80COMNTOOLS=%VS80COMNTOOLS%
set VSINSTALLDIR=F:\Program Files\Microsoft Visual Studio 9.0
set VCINSTALLDIR=%VSINSTALLDIR%\VC
set WINSDKDIR=C:\Program Files\Microsoft SDKs\Windows\V6.0A
set PATH=%VCINSTALLDIR%\BIN;%WINSDKDIR%\bin;%VSINSTALLDIR%\Common7\IDE;%VSINSTALLDIR%\SDK\v2.0\bin;%VSINSTALLDIR%\Common7\Tools;%VSINSTALLDIR%\Common7\Tools\bin;%VCINSTALLDIR%\VCPackages;%MATLAB_BIN%;%PATH%
set INCLUDE=%VCINSTALLDIR%\ATLMFC\INCLUDE;%VCINSTALLDIR%\INCLUDE;%WINSDKDIR%\INCLUDE;%VSINSTALLDIR%\SDK\v2.0\include;%INCLUDE%
set LIB=%VCINSTALLDIR%\ATLMFC\LIB;%VCINSTALLDIR%\LIB;%WINSDKDIR%\lib;%VSINSTALLDIR%\SDK\v2.0\lib;%MATLAB%\extern\lib\win32;%LIB%
set MW_TARGET_ARCH=win32

rem ************************************************************


rem Compiler parameters
rem ************************************************************


set COMPILER=nvcc
set COMPFLAGS=-c -D_WCHAR_T_DEFINED -Xcompiler “/c /Zp8 /GR /W3 /EHsc- /Zc:wchar_t /DMATLAB_MEX_FILE /nologo”
rem COMPFLAGS=-ccbin “F:\Program Files\Microsoft Visual Studio 9.0\VC\bin” -c -D_WCHAR_T_DEFINED -Xcompiler “/c /Zp8 /GR /W3 /EHsc- /Zc:wchar_t- /DMATLAB_MEX_FILE /nologo”
set OPTIMFLAGS=-D_WCHAR_T_DEFINED -Xcompiler “/MD /O2 /Oy- /DNDEBUG”
set DEBUGFLAGS=-D_WCHAR_T_DEFINED -Xcompiler “/MD /Zi /Fd”%OUTDIR%%MEX_NAME%%MEX_EXT%.pdb"
set NAME_OBJECT=-o

rem ************************************************************


rem Linker parameters
rem ************************************************************


set LIBLOC=%MATLAB%\extern\lib\win32\microsoft
set LINKER=link
rem set LINKER=nvcc
set LINKFLAGS=/dll /export:%ENTRYPOINT% /MAP /LIBPATH:"%LIBLOC%" libmx.lib libmex.lib libmat.lib /implib:%LIB_NAME%.x /MACHINE:X86 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
set LINKOPTIMFLAGS=
set LINKDEBUGFLAGS=/DEBUG /PDB:"%OUTDIR%%MEX_NAME%%MEX_EXT%.pdb"
set LINK_FILE=
set LINK_LIB=
set NAME_OUTPUT=/out:"%OUTDIR%%MEX_NAME%%MEX_EXT%"
set RSP_FILE_INDICATOR=@

rem ************************************************************


rem Resource compiler parameters
rem ************************************************************


set RC_COMPILER=rc /fo “%OUTDIR%mexversion.res”
set RC_LINKER=

set POSTLINK_CMDS=del “%OUTDIR%%MEX_NAME%.map”
set POSTLINK_CMDS1=del %LIB_NAME%.x
set POSTLINK_CMDS2=mt -outputresource:"%OUTDIR%%MEX_NAME%%MEX_EXT%";2 -manifest “%OUTDIR%%MEX_NAME%%MEX_EXT%.manifest”
set POSTLINK_CMDS3=del “%OUTDIR%%MEX_NAME%%MEX_EXT%.manifest”

  1. Далее

nvmex -f nvmexopts.bat Szeta.cu -IF:\cuda\include -LF:\cuda\lib -lcufft -lcudart
which Szeta
‘D:\Users\Vasiliy\Matlab\CUDA Experience\Matlab_CUDA_1.1\Szeta.mexw32’

tic; FS_2Dturb(128,1,1,1); toc;
CFL =

0.1017

Gsqav =

1.1995

Elapsed time is 13.644046 seconds.

tic; FS_vortex; toc;

ans =

512

Elapsed time is 85.913219 seconds.

Как видите даже на такой «слабой» системе довольно значительно возрастает производительность.