2014-04-27 4 views
1

64x VS2010 프로젝트에 .cu 파일이 있습니다. 이 프로젝트는 .mexw64 파일을 추출하도록 구성되었습니다. 벨로가 거기 나는 실행 예제입니다. mex 함수 안에 Armadillo 선형 대수 라이브러리의 일부 함수를 사용하고 싶습니다. #include "armaMex.hpp" 사용하는 경우 그래서 컴파일러는 약간의 오차가 반환 :CUDA 및 Armadillo 사용

  1. 오류 C3203을 '고정'특화되지 않은 클래스 템플릿은 템플릿 매개 변수 'T1'에 대한 템플릿 인수로 사용할 수 없습니다 실제에 c를 예상 : .... \ armadillo-4.200.0 \ include \ armadillo_bits \ Mat_meat.hpp
  2. 오류 C2955 : 'arma :: Mat :: fixed': 클래스 템플릿을 사용하려면 템플릿 인수 목록 c : \ .... \ armadillo-4.200.0 \ include \ armadillo_bits \ Mat_meat.hpp
  3. 오류 C1903 : 이전 오류에서 복구 할 수 없습니다. 컴파일을 중지하는 중 C : \ .... \ armadillo-4.200.0 \ include \ armadillo_bits \ Mat_meat.hpp

이 오류의 원인은 무엇인지 알 수 없습니다. 설명해 주시겠습니까?

#include "mex.h" 
#include "armaMex.hpp" 
void 
    mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) 
{ 
    mexPrintf("hello!\n"); 
} 

PS : CUDA SDK 5.5 64X, VS2010

+0

MS VS C++ 컴파일러는 강력하고 C++ 표준을 올바르게 따르지 않습니다. 최신 버전의 VS를 사용하거나 GCC와 같은 일반적인 C++ 컴파일러를 사용하는 것이 좋습니다. Windows의 경우 [MinGW 프로젝트] (http://www.mingw.org)를 통해 얻을 수 있습니다. – mtall

+0

CUDA를 사용하는 BLAS의 구현 인 [NVBLAS] (https://developer.nvidia.com/cublasxt)도보십시오. 그런 다음 Armadillo 기반 프로그램을 컴파일 할 때 BLAS 대신 NVBLAS와 연결할 수 있습니다. – mtall

+0

이 질문이 CUDA 프로그래밍과 관련이 있는지 이해할 수 없습니다. 게시 된 예제에는 Matlab mex 헤더와 Armadillo 헤더가 혼합되어 있습니다. 맞습니까? – talonmies

답변

4

이것은 (내 생각 ++ 기술적 cudafe) NVCC의 알려진 제한 사항입니다. nvcc는 파일 확장자를 사용하여 주어진 소스 파일을 장치 코드 용으로 처리할지 또는 CUDA 전 처리기로 전달한 다음 장치 컴파일러로 전달할지 결정합니다. 컴파일 궤도가 Armadillo에 포함 된 매우 복잡한 선언 중 일부를 올바르게 구문 분석 할 수 없으며 컴파일이 실패한 것처럼 보입니다. 이것은 Boost, Eigen 및 QT에서 발생하는 것으로 알려져 있습니다. 아르마딜로도 같은 배에 있다고 생각해.

해결 방법은 .cu 파일 내부에서 Armadillo 헤더를 가져 오지 않는 것입니다. 호스트 부스트 코드를 .cc 파일에 넣으면 장치 코드와 커널이 별도의 .cu 파일로 시작되고 .cc 파일에서 커널 호출에 액세스 할 수 있도록 일부 랩퍼가 만들어집니다. nvcc에 모든 소스를 전달하여 단일 오브젝트 파일로 컴파일 할 수 있지만 장치 코드에서 Armadillo 가져 오기를 분리하면 Armadillo에 포함 된 복잡한 템플릿 선언에서 프런트 엔드가 질식하는 문제가 해결됩니다.

+0

이 단계에서 cuda로 번역하려는 코드는 armadillo를 사용합니다. 그래서이 단계에서 .cu 파일에 "armaMex.hpp"를 #include하지 않고도 armadillo 구조체가 포함 된 래퍼 함수를 ​​만드는 것은 불가능합니다. 첫 번째 단계에서는 mex 지원을 사용하여 현재 구현을 실행하여 Matlab에서 결과를 시각화하려고합니다. 두 번째 단계는 커널 구축을 위해 순전히 C로 진행됩니다. 다른 제안 사항은 높이 평가됩니다. – Thoth

+0

Armadillo는'.hpp' 타입의 라이브러리이기 때문에'#include "armaMex.hpp"를'.cu'에 선언하지만 호스트 컴파일러에서 빌드를 위해 보내면됩니까? – Thoth