проблема с nvmex в matlab - PullRequest
       27

проблема с nvmex в matlab

1 голос
/ 06 сентября 2011

Я установил Matlab в моей системе, а также установил CUDA SDK для Windows. Однако я не могу скомпилировать любые файлы .cu. Я включил файл сценария nvmex в каталог bin пути установки Matlab. Может ли какое-то тело помочь?

Ответы [ 2 ]

2 голосов
/ 07 сентября 2011

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).

0 голосов
/ 08 сентября 2011

Я бы предложил использовать CUDA mex из обмена файлами Matlab.

Это позволяет вам компилировать через Matlab. Это улучшает совместимость между версиями Matlab и Visual Studio, не заставляя вас явно указывать зависимости mex через Visual Studio.

...