システムにmatlabをインストールし、Windows用のCUDA SDKもインストールしました。ただし、.cu ファイルをコンパイルできません。Matlab インストール パスの bin ディレクトリに nvmex スクリプト ファイルを含めました。体が助けてくれる?
2 に答える
nvmexは、MatlabまたはCudaSDKの最近のバージョンでは実際にはサポートされていません。代わりに、標準のMEXインターフェイスを使用してCudaを実行する単純なDLLをVisualStudioで作成することをお勧めします。プロジェクトの名前は「addAtoB」であり、例を簡単にするために2つの数値を足し合わせたいと仮定します。
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(64ビットMatlabを使用している場合は.mexw64)に変更します。次に、コマンドで実行できるはずですaddAtoB(1, 2)
。
Matlabファイル交換のCUDAmexを使用することをお勧めします。
これにより、Matlabを介してコンパイルできます。これにより、Visual Studioを介してmex依存関係を明示的に指定する必要がなくなるため、MatlabバージョンとVisualStudioバージョン間の互換性が向上します。