2011-09-01 5 views
0

저는 C 코드를 다루는 초보자입니다.하지만 신경 네트워크 시뮬레이션을위한 Matlab 프로그램을 작성했으며 슈퍼 컴퓨터 클러스터가 신경망을 시뮬레이트하기위한 Matlab 프로그램을 C 코드로 변환하려고합니다. 한 번에 몇 MATLAB 시뮬레이션. 이를 위해 GotoBLAS가 행렬 수학을 처리하는 것을 발견했습니다.C와 함께 GotoBLAS2 사용하기

C에서 많은 경험이없고 외부 라이브러리를 사용하기 때문에 불행히도 사용 방법을 모르겠습니다. 나는 'dgemm'이 BLAS 가이드 PDF를 읽는 GotoBLAS의 함수라고 가정합니다. 나는 성공적 GotoBLAS를 컴파일 할 수있었습니다,하지만 내가 할 때 아마 내가 알고있는 것처럼

undefined reference to 'dgemm' 

, 좀 .h 파일을 포함해야합니다 (또는 :

gcc -o outputprog main.c -Wall -L -lgoto2.a 

을 나는 메시지를 얻을) GotoBLAS에서하지만 어느 것이 확실하지 않다면 (또는 이것이 전부라면).

이 문제에 도움을 주시면 감사하겠습니다. 더 많은 정보가 필요한지 알려주십시오.

+0

찾은 BLAS 가이드의 URL을 게시하면 도움이됩니다. 겸손하게 광범위한 Google 검색은 매뉴얼에 대한 유용한 위치 (또는 실제로 힌트)를 보여주지 못했습니다. –

+0

가이드 링크는 다음과 같습니다. http://www.netlib.org/blas/blasqr.pdf 기능의 목록 일뿐 사용 방법은 아닙니다. – CHP

답변

3

좋아. 다음은 GotoBLAS2를 C 및 GCC 컴파일러와 함께 사용하는 단계별 절차입니다.

Build GotoBLAS2 라이브러리 (.so 및 .a)에는 라이브러리에 포함 된 설명서가 있으므로 여기에 게시하지 않습니다. -L로 설정 한대로 선택한 libs 디렉토리에이 파일들 모두를 포함하십시오. 나는 그들이 틀린 동일한 라이브러리의 다른 버전 일 뿐이라고 생각하여 하나만 포함했습니다.

또한 gcc로 컴파일하려면 -lgfortran으로 링크하십시오. -lpthread도 유용 할 수 있습니다. 확실하지는 않지만 예제를 본 적이 있지만 컴파일하지 않습니다. 귀하의 GCC는 다음과 같이 보일 것이다 :

gcc -Wall -o outprog -L./GotoLIBSDIR -lgoto2 -lgfortran -lpthread(maybe) main.c

마지막으로, 예를 들어, dgemm_()은 포트란 인터페이스를 컴파일 gfortran을 사용하는 경우, 그래서 function() 대신 function_()를 호출합니다.

포트란 인터페이스 대신, cblas 인터페이스는 cblas_dgemm()으로 사용할 수 있습니다. 이 경우 -lgfortran에 연결해야합니다. 그렇지 않으면 libgoto2.so에 대한 연결이 실패하고 cblas_dgemm()을 올바르게 사용하려면 해당 파일에 연결해야합니다.

.h 파일이나 그 밖의 파일을 포함 할 필요가없는 것으로 보입니다.

다른 사람이 유용하게 사용하기를 바랍니다. 모든 도움에 감사드립니다!

6

하나의 문제는 -L 옵션은 후 '디렉토리의 이름을 기대하는 수, 따라서 gcc (또는 gcc에 의해 호출 링커) 디렉토리로 -lgoto2.a을 치료한다. 컴파일러는 존재하지 않는 디렉토리에 대해 불평하지 않습니다. 그것은 단순히 그들을 무시합니다. 라이브러리를 찾을 디렉토리는 어느 디렉토리입니까? (이 대답의 목적을 위해, 나는 그것이 /usr/local/lib에 있다고 가정 할 것이다.)

또 다른 문제는 라이브러리가 libgoto2.a.a 또는 libgoto2.a.so 또는 비슷한 것으로 불리지 않을 수 있다는 것입니다. 일반적으로 .a 접미사를 지정하지 않습니다. 이 대답의 목적을 위해 라이브러리는 libgoto2.a 또는 libgoto2.so라고 가정합니다.

헤더가있는 위치를 지정할 필요가없는 것으로 보입니다. 이는 컴파일러가 어쨌든 거기서 보게되는 충분히 전통적인 위치에 있음을 의미합니다. 그게 맞다면 라이브러리도 충분히 전통적인 위치에있을 수 있고, -L 옵션은 불필요 할 수 있습니다.

그래서, 당신은 사용할 수 있습니다

gcc -Wall -o outputprog main.c -lgoto2 

을 또는 당신은 사용할 필요가 있습니다

gcc -Wall -o outputprog main.c -L/usr/local/lib -lgoto2 

을 코멘트에 일부 광범위한 토론 후, 그리고 정보가 라이브러리가 현재 디렉토리에 있고 이름이 libgoto2.a이고 심볼 dgemm이 여전히 누락 된 경우 GotoBLAS2 version 1.13을 다운로드하고 semi-sup로 컴파일하려고했습니다. (MacOS X, 아마도 리눅스 인 척하면서 x86_64 아키텍처). 빌드가 성공적이지 못했습니다. 일부 어셈블러 코드의 문제. 그러나, 헤더에 주위 파고, 문제의 해결책을 제공과 같은 것이있다 : 많은 다른 함수 정의 사이에,이에

cblas.h 

, 우리는 찾을 수 :

void cblas_dgemm(enum CBLAS_ORDER Order, enum CBLAS_TRANSPOSE TransA, 
       enum CBLAS_TRANSPOSE TransB, blasint M, blasint N, blasint K, 
       double alpha, double *A, blasint lda, double *B, blasint ldb, 
       double beta, double *C, blasint ldc); 

모든 기능을 헤더의 기호 앞에 cblas_이 붙습니다.귀하의 코드가 사용되어야합니다 :

#include "cblas.h" 
당신은 cblas_ 접두사 (소문자) 포트란 이름을 사용하여 함수를 호출해야

:

cblas_dgemm(...); 

그리고 사용할 올바른 링크 라인은 첫 번째 옵션이다 핀치에서

gcc -Wall -o outputprog main.c -lgoto2 

, 당신은 매크로를 정의 할 수 있습니다 : 위에 나열된 올바른 C 함수 이름으로 일반 (접두어가) 이름을 매핑,하지만 난 그것을 가치가 확신 아니에요 그것은 :

#define DGEMM cblas_dgemm 

또는 (안전, 그것은 인수 목록의 길이하지만, 더 자세한 정보를 확인하기 때문에) :

DGEMM(a, ..., n); 

을 올바른 함수가 호출 될 것이다 :

#define DGEMM(a,b,c,d,e,f,g,h,i,j,k,l,m,n) cblas_dgemm(a,b,c,d,e,f,g,h,i,j,k,l,m,n) 

그런 다음 쓸 수 있습니다. GotoBLAS2의 부분적으로 성공적으로 빌드


실험은 위에서 언급 한 것을 보여줍니다

  • cblas.h은 자체에 포함 된 (좋은 코딩 표준에 반하는)이 아니다.
  • common.h을 포함해야합니다.
  • common.h
  • 다른 헤더를 많이 포함
    • config.h 파일을
    • common_x86_64.h
    • param.h
    • common_param.h
    • common_interface.h
    • common_macro.h
    • common_s.h
    • common_d.h
    • ,515,
    • common_q.h
    • common_c.h
    • common_z.h
    • common_x.h
    • common_level1.h
    • common_level2.h
    • common_level3.h
    • common_lapack.h
  • 다음 코드는 전체 lib와 링크 할 수있는 기회를 제공합니다 rary :

    #include "common.h" 
    #include "cblas.h" 
    
    void check_dgemm(void) 
    { 
        double A[33] = { 0.0 }; 
        double B[33] = { 0.0 }; 
        double C[33] = { 0.0 }; 
        cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, 
           3, 3, 3, 2.0, A, 3, B, 3, 3.0, C, 3); 
    } 
    
    int main(void) 
    { 
        check_dgemm(); 
        return 0; 
    } 
    

    이 (도서관 내 틀림없이 깨진 빌드에서 불만되는 것을 갔다는없는 다른 기능의 번호로 'cblas_dgemm()을 찾을 수 없습니다'.이 광대 한 개선이다!) 내가 볼 수)까지 웹 사이트에 나열되지 않은 목록 https://lists.tacc.utexas.edu/mailman/listinfo/gotoblas을 (메일 링 GotoBLAS에 대한 답을 찾을 수 있었다

+0

https://lists.tacc.utexas.edu/mailman/listinfo/gotoblas에서 GotoBLAS2 메일 링리스트 (어떤 이유로 든 프로젝트 페이지에서 찾을 수 없음)를 발견하고 아래에 게시 한 답변을 얻을 수있었습니다. 나는 의견을 삭제할 것입니다. 일단 당신이 무엇을 해야할지 안다면 실제로는 다소 단순합니다. 어쨌든 모든 도움과 컴파일러가 라이브러리 파일을 찾지 못하는 문제를 해결해 주셔서 감사합니다! – CHP

관련 문제