Visual Studio 2013을 사용하여 MATLAB 용 CUDA mex 파일 인 다음 프로그램을 컴파일하려고합니다. MATLAB의 공식 웹 사이트에는 CUDA mex 용이 아닌 C ++ Mex 파일 용으로 만 제공
되는 지침이 있습니다.
그래서 Mathworks의 공식 지침을 따르면서 프로젝트 설정을 다음과 같이 추가로 변경했습니다.
1. 설치된 CUDA 6.5 런타임과 함께 Visual studio 프로젝트를 사용하여 프로젝트를 만들었습니다.
2. 내 VS 프로젝트의 링커 속성에 libs (libmx.lib, libmex.lib, libmat.lib, gpu.lib)가
포함되었습니다. 3. 디렉터리 포함 추가 (MATLABROOT) \ toolbox \ distcomp \ gpu \ extern \ include ;
여전히 해결되지 않은 외부 기호 오류가 많이 발생합니다. VS IDE를 사용하여 CUDA Mex를 컴파일하는 데 사용할 수있는 공식 문서가 없기 때문에이를 수행하는 올바른 방법은 무엇입니까? 누구든지 이것을 수행하는 적절한 방법이 무엇인지 알고 있습니까? 확실히 나는 일부 설정을 놓치고 있습니다. 누군가 제발 도와 줄 수 있습니까?
내 프로그램 (MATLAB 예제 파일 mexGPUExample.cu에서 복사)은 다음과 같습니다.
**
/*
* Example of how to use the mxGPUArray API in a MEX file. This example shows
* how to write a MEX function that takes a gpuArray input and returns a
* gpuArray output, e.g. B=mexFunction(A).
*
* Copyright 2012 The MathWorks, Inc.
*/
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include "mex.h"
#include "gpu/mxGPUArray.h"
/*
* Device code
*/
void __global__ TimesTwo(double const * const A,
double * const B,
int const N)
{
/* Calculate the global linear index, assuming a 1-d grid. */
int const i = blockDim.x * blockIdx.x + threadIdx.x;
if (i < N) {
B[i] = 2.0 * A[i];
}
}
/*
* Host code
*/
void mexFunction(int nlhs, mxArray *plhs[],
int nrhs, mxArray const *prhs[])
{
/* Declare all variables.*/
mxGPUArray const *A;
mxGPUArray *B;
double const *d_A;
double *d_B;
int N;
char const * const errId = "parallel:gpu:mexGPUExample:InvalidInput";
char const * const errMsg = "Invalid input to MEX file.";
/* Choose a reasonably sized number of threads for the block. */
int const threadsPerBlock = 256;
int blocksPerGrid;
/* Initialize the MathWorks GPU API. */
mxInitGPU();
/* Throw an error if the input is not a GPU array. */
if ((nrhs != 1) || !(mxIsGPUArray(prhs[0]))) {
mexErrMsgIdAndTxt(errId, errMsg);
}
A = mxGPUCreateFromMxArray(prhs[0]);
/*
* Verify that A really is a double array before extracting the pointer.
*/
if (mxGPUGetClassID(A) != mxDOUBLE_CLASS) {
mexErrMsgIdAndTxt(errId, errMsg);
}
/*
* Now that we have verified the data type, extract a pointer to the input
* data on the device.
*/
d_A = (double const *)(mxGPUGetDataReadOnly(A));
/* Create a GPUArray to hold the result and get its underlying pointer. */
B = mxGPUCreateGPUArray(mxGPUGetNumberOfDimensions(A),
mxGPUGetDimensions(A),
mxGPUGetClassID(A),
mxGPUGetComplexity(A),
MX_GPU_DO_NOT_INITIALIZE);
d_B = (double *)(mxGPUGetData(B));
/*
* Call the kernel using the CUDA runtime API. We are using a 1-d grid here,
* and it would be possible for the number of elements to be too large for
* the grid. For this example we are not guarding against this possibility.
*/
N = (int)(mxGPUGetNumberOfElements(A));
blocksPerGrid = (N + threadsPerBlock - 1) / threadsPerBlock;
TimesTwo <<< blocksPerGrid, threadsPerBlock >>>(d_A, d_B, N);
/* Wrap the result up as a MATLAB gpuArray for return. */
plhs[0] = mxGPUCreateMxArrayOnGPU(B);
/*
* The mxGPUArray pointers are host-side structures that refer to device
* data. These must be destroyed before leaving the MEX function.
*/
mxGPUDestroyGPUArray(A);
mxGPUDestroyGPUArray(B);
}
프로그램을 컴파일하려고 할 때 발생하는 오류 :
Error 66 error LNK1120: 64 unresolved externals
Error 64 error LNK2001: unresolved external symbol _fltused
Error 62 error LNK2001: unresolved external symbol _RTC_InitBase
Error 63 error LNK2001: unresolved external symbol _RTC_Shutdown
Error 65 error LNK2001: unresolved external symbol mainCRTStartup
Error 58 error LNK2019: unresolved external symbol __imp__dsign referenced in function "bool __cdecl signbit(double)" (?signbit@@YA_NN@Z)
Error 60 error LNK2019: unresolved external symbol __imp__fdsign referenced in function "bool __cdecl signbit(float)" (?signbit@@YA_NM@Z)
Error 61 error LNK2019: unresolved external symbol __imp__hypotf referenced in function hypotf
Error 59 error LNK2019: unresolved external symbol __imp__ldsign referenced in function "bool __cdecl signbit(long double)" (?signbit@@YA_NO@Z)
Error 39 error LNK2019: unresolved external symbol __imp_acosf referenced in function "float __cdecl acos(float)" (?acos@@YAMM@Z)
Error 12 error LNK2019: unresolved external symbol __imp_acoshf referenced in function "float __cdecl acosh(float)" (?acosh@@YAMM@Z)
Error 40 error LNK2019: unresolved external symbol __imp_asinf referenced in function "float __cdecl asin(float)" (?asin@@YAMM@Z)
Error 13 error LNK2019: unresolved external symbol __imp_asinhf referenced in function "float __cdecl asinh(float)" (?asinh@@YAMM@Z)
Error 42 error LNK2019: unresolved external symbol __imp_atan2f referenced in function "float __cdecl atan2(float,float)" (?atan2@@YAMMM@Z)
Error 41 error LNK2019: unresolved external symbol __imp_atanf referenced in function "float __cdecl atan(float)" (?atan@@YAMM@Z)
Error 14 error LNK2019: unresolved external symbol __imp_atanhf referenced in function "float __cdecl atanh(float)" (?atanh@@YAMM@Z) D:\GitHub\arrayfire-windows-scripts\SimpleCUDAProj\CUDA_Mex\CUDA_Mex\CUDA_Times_Two.cu.obj CUDA_Mex
Error 29 error LNK2019: unresolved external symbol __imp_cbrtf referenced in function "float __cdecl cbrt(float)" (?cbrt@@YAMM@Z)
Error 55 error LNK2019: unresolved external symbol __imp_ceilf referenced in function "float __cdecl ceil(float)" (?ceil@@YAMM@Z)
Error 36 error LNK2019: unresolved external symbol __imp_copysignf referenced in function "float __cdecl copysign(float,float)" (?copysign@@YAMMM@Z)
Error 43 error LNK2019: unresolved external symbol __imp_cosf referenced in function "float __cdecl cos(float)" (?cos@@YAMM@Z)
Error 46 error LNK2019: unresolved external symbol __imp_coshf referenced in function "float __cdecl cosh(float)" (?cosh@@YAMM@Z)
Error 33 error LNK2019: unresolved external symbol __imp_erfcf referenced in function "float __cdecl erfc(float)" (?erfc@@YAMM@Z)
Error 32 error LNK2019: unresolved external symbol __imp_erff referenced in function "float __cdecl erf(float)" (?erf@@YAMM@Z)
Error 8 error LNK2019: unresolved external symbol __imp_exp2f referenced in function "float __cdecl exp2(float)" (?exp2@@YAMM@Z)
Error 49 error LNK2019: unresolved external symbol __imp_expf referenced in function "float __cdecl exp(float)" (?exp@@YAMM@Z)
Error 9 error LNK2019: unresolved external symbol __imp_expm1f referenced in function "float __cdecl expm1(float)" (?expm1@@YAMM@Z)
Error 28 error LNK2019: unresolved external symbol __imp_fdimf referenced in function "float __cdecl fdim(float,float)" (?fdim@@YAMMM@Z)
Error 56 error LNK2019: unresolved external symbol __imp_floorf referenced in function "float __cdecl floor(float)" (?floor@@YAMM@Z)
Error 38 error LNK2019: unresolved external symbol __imp_fmaf referenced in function "float __cdecl fma(float,float,float)" (?fma@@YAMMMM@Z)
Error 7 error LNK2019: unresolved external symbol __imp_fmaxf referenced in function "float __cdecl fmax(float,float)" (?fmax@@YAMMM@Z)
Error 6 error LNK2019: unresolved external symbol __imp_fminf referenced in function "float __cdecl fmin(float,float)" (?fmin@@YAMMM@Z)
Error 57 error LNK2019: unresolved external symbol __imp_fmodf referenced in function "float __cdecl fmod(float,float)" (?fmod@@YAMMM@Z)
Error 19 error LNK2019: unresolved external symbol __imp_frexp referenced in function frexpf
Error 17 error LNK2019: unresolved external symbol __imp_ilogbf referenced in function "int __cdecl ilogb(float)" (?ilogb@@YAHM@Z)
Error 15 error LNK2019: unresolved external symbol __imp_ldexp referenced in function ldexpf
Error 34 error LNK2019: unresolved external symbol __imp_lgammaf referenced in function "float __cdecl lgamma(float)" (?lgamma@@YAMM@Z)
Error 25 error LNK2019: unresolved external symbol __imp_llrintf referenced in function "__int64 __cdecl llrint(float)" (?llrint@@YA_JM@Z)
Error 22 error LNK2019: unresolved external symbol __imp_llroundf referenced in function "__int64 __cdecl llround(float)" (?llround@@YA_JM@Z)
Error 51 error LNK2019: unresolved external symbol __imp_log10f referenced in function "float __cdecl log10(float)" (?log10@@YAMM@Z)
Error 11 error LNK2019: unresolved external symbol __imp_log1pf referenced in function "float __cdecl log1p(float)" (?log1p@@YAMM@Z)
Error 10 error LNK2019: unresolved external symbol __imp_log2f referenced in function "float __cdecl log2(float)" (?log2@@YAMM@Z)
Error 16 error LNK2019: unresolved external symbol __imp_logbf referenced in function "float __cdecl logb(float)" (?logb@@YAMM@Z)
Error 50 error LNK2019: unresolved external symbol __imp_logf referenced in function "float __cdecl log(float)" (?log@@YAMM@Z)
Error 24 error LNK2019: unresolved external symbol __imp_lrintf referenced in function "long __cdecl lrint(float)" (?lrint@@YAJM@Z)
Error 21 error LNK2019: unresolved external symbol __imp_lroundf referenced in function "long __cdecl lround(float)" (?lround@@YAJM@Z)
Error 52 error LNK2019: unresolved external symbol __imp_modff referenced in function "float __cdecl modf(float,float *)" (?modf@@YAMMPEAM@Z)
Error 26 error LNK2019: unresolved external symbol __imp_nearbyintf referenced in function "float __cdecl nearbyint(float)" (?nearbyint@@YAMM@Z)
Error 37 error LNK2019: unresolved external symbol __imp_nextafterf referenced in function "float __cdecl nextafter(float,float)" (?nextafter@@YAMMM@Z)
Error 53 error LNK2019: unresolved external symbol __imp_powf referenced in function "float __cdecl pow(float,float)" (?pow@@YAMMM@Z)
Error 30 error LNK2019: unresolved external symbol __imp_remainderf referenced in function "float __cdecl remainder(float,float)" (?remainder@@YAMMM@Z)
Error 31 error LNK2019: unresolved external symbol __imp_remquof referenced in function "float __cdecl remquo(float,float,int *)" (?remquo@@YAMMMPEAH@Z)
Error 23 error LNK2019: unresolved external symbol __imp_rintf referenced in function "float __cdecl rint(float)" (?rint@@YAMM@Z)
Error 20 error LNK2019: unresolved external symbol __imp_roundf referenced in function "float __cdecl round(float)" (?round@@YAMM@Z)
Error 18 error LNK2019: unresolved external symbol __imp_scalblnf referenced in function "float __cdecl scalbln(float,long)" (?scalbln@@YAMMJ@Z)
Error 44 error LNK2019: unresolved external symbol __imp_sinf referenced in function "float __cdecl sin(float)" (?sin@@YAMM@Z)
Error 47 error LNK2019: unresolved external symbol __imp_sinhf referenced in function "float __cdecl sinh(float)" (?sinh@@YAMM@Z)
Error 54 error LNK2019: unresolved external symbol __imp_sqrtf referenced in function "float __cdecl sqrt(float)" (?sqrt@@YAMM@Z)
Error 45 error LNK2019: unresolved external symbol __imp_tanf referenced in function "float __cdecl tan(float)" (?tan@@YAMM@Z)
Error 48 error LNK2019: unresolved external symbol __imp_tanhf referenced in function "float __cdecl tanh(float)" (?tanh@@YAMM@Z)
Error 35 error LNK2019: unresolved external symbol __imp_tgammaf referenced in function "float __cdecl tgamma(float)" (?tgamma@@YAMM@Z)
Error 27 error LNK2019: unresolved external symbol __imp_truncf referenced in function "float __cdecl trunc(float)" (?trunc@@YAMM@Z)
Error 2 error LNK2019: unresolved external symbol atexit referenced in function "void __cdecl __nv_cudaEntityRegisterCallback(void * *)" (?__nv_cudaEntityRegisterCallback@@YAXPEAPEAX@Z)
Error 5 error LNK2019: unresolved external symbol fabs referenced in function "double __cdecl abs(double)" (?abs@@YANN@Z)
Error 3 error LNK2019: unresolved external symbol labs referenced in function "long __cdecl abs(long)" (?abs@@YAJJ@Z)
Error 4 error LNK2019: unresolved external symbol llabs referenced in function "__int64 __cdecl abs(__int64)" (?abs@@YA_J_J@Z)
귀하의 경우 주요 문제는 잘못된 프로젝트 유형을 선택한 것 같습니다. 아마도 일반 Win32 프로젝트 (DLL 옵션 포함) 대신 MFC DLL을 사용하고있을 것입니다. 그러나 (a) mxGPUArray
Parallel Computing Toolbox의 일부인 유형을 사용 하고 (b) NVIDIA CUDA SDK 컴파일러로 컴파일 된 CUDA 커널 (사용자 지정 GPU 장치 코드)을 포함하는 MEX 파일을 빌드하는 데 더 많은 설정이 필요 합니다. nvcc.
일반적인 MEX 관련 설정을 구성했다고 가정하면 CUDA "Build Customization"을 선택하여 .cu 파일의 컴파일러로 nvcc를 구성합니다. 그런 다음 "상위 또는 프로젝트 기본값에서 상속"상자를 선택하여 링크 된 모든 표준 Windows 라이브러리 종속성이 있는지 확인하면서 CUDA 런타임 라이브러리를 지정해야 할 수도 있습니다.
이런 식으로 잘 컴파일되고 연결되었습니다.
그러나 여기에 설명 된대로 속성 시트 (MATLAB.props)를 사용하여 Visual Studio 프로젝트 를 설정했습니다 . 그러면 위에서 언급 한 표준 MEX 설정이 자동으로 적용됩니다. 편집 : 속성 시트에 Parallel Computing Toolbox 지원을 추가했습니다. 위에 표시된대로 cudart_static.lib 부분을 추가하고 CUDA 빌드 사용자 정의를 선택하여 nvcc로 .cu 파일을 컴파일하기 만하면됩니다.
빌드 사용자 지정을 통해 CUDA 6.5 SDK 설정 추가. 먼저 프로젝트 (솔루션 아님)를 마우스 오른쪽 버튼으로 클릭합니다.
사용하려는 CUDA 사용자 정의를 확인하십시오 (이 경우 SDK 6.5).
그리고 이러한 필드를 편집하고 싶은 경우에 대비하여 절대 편집하지 마십시오.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다