nvmex действительно не поддерживается ни в каких последних версиях Matlab или Cuda SDK.Вместо этого я бы предложил написать простую DLL в Visual Studio, которая использует стандартный интерфейс 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();
}
Вам необходимо добавить несколько каталогов вВаш путь включения: 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)
.