CUDA 강의
홈 > CUDA > CUDA 강의 > cuBLAS 강좌

cuBLAS 강좌


 cuBLAS는 NVIDIA에서 제공하는 CUDA 가속기능이 내장된 BLAS 함수들의 모음입니다.

 

 

BLAS는 과학계산 개발자들이 H/W 스펙에 따른 최적화 노력을 기울이지 않고, 쉽게 최적화된 함수를 사용할 수 있도록 하기 위해 업계표준으로 사용하는 하위레벨의 API로, 각 H/W벤더가 제공하고 있습니다. 현재  Intel CPU, AMD CPU, IBM PowerPC, CELL CPU, NVIDIA GPU 등에서 BLAS level I, II, III 를 제공하고 있습니다. BLAS는 다음의 세가지 레벨을 가지고 있습니다.

 

BLAS level 1 Vector Vector 연산

BLAS level 2 Vector Matrix 연산

BLAS level 3 Matrix Matrix 연산

 

실제로 Linpack이나 행렬연산의 알고리즘을 분석해보면 BLAS level I, II, III 함수들의 연속적인 재사용이라는 것을 쉽게 알 수 있습니다. 따라서 BLAS 함수를 통해서 다양한 알고리즘을 구현하는 것이 가능합니다.

 

BLAS 함수의 함수명, 파라미터 설정은 BLAS 표준을 따르고 있습니다. 좀더 자세한 내용은  CUDA toolkit이 설치된 디렉터의 doc 디렉토리에 CUBLAS 매뉴얼을 확인하실 수 있습니다.  http://www.netlib.org/blas/ 를 확인하시면 blas에 관한 정보와 fortran으로 짜여진 표준 BLAS 함수를 확인하실 수 있습니다. 또한,  goto BLAS를 확인하시면, 최신 버전의 BLAS 서브루틴을 확인가능합니다.

 

cuBLAS는 CUDA toolkit설치디렉토리의 lib 디렉토리에서 cublas.lib 파일과 cublasemu.lib 파일을 확인하실 수 있습니다

 


 

 

1. SDK의 simpleCUBLAS예제

simpleCUBLAS 예제를 통해 간단하게 cuBLAS를 어떻게 활용하는지에 대해 살펴볼 수 있습니다. 특히, project의 속성을 살펴보면 필요한 header file, 종속성 등을 살필 수 있습니다.

 

 

 

2. cuBLAS 예제

다음은 좀더 간단한 CUBLAS 예제입니다.

다음의 source.c 파일을 새로운 프로젝트를 만들어 cuBLAS를 실행해 보도록 하겠습니다.

 

#include

#include

#include

#include

 

#define M 6

#define N 5

 

#define IDX2C(i,j,ld) (((j)*(ld))+(i))

 

void modify (float *m, int ldm, int n, int p, int q, float alpha,float beta)

{

        cublasSscal (n-p, alpha, &m[IDX2C(p,q,ldm)], ldm);

        cublasSscal (ldm-p, beta, &m[IDX2C(p,q,ldm)], 1);

}

 

int main(int argc, char *argv[])

{

        int i, j;

        cublasStatus stat;

        float* devPtrA;

        float* a = 0;

        a = (float *)malloc (M * N * sizeof (*a));

        if (!a) {

                printf ("host memory allocation failed");

                return 1;

        }

        for (j = 0; j < N; j++) {

                for (i = 0; i < M; i++) {

                        a[IDX2C(i,j,M)] = i * M + j + 1;

                }

        }

        cublasInit();

        stat = cublasAlloc (M*N, sizeof(*a), (void**)&devPtrA);

        if (stat != CUBLAS_STATUS_SUCCESS) {

                printf ("device memory allocation failed");

                return 1;

        }

        cublasSetMatrix (M, N, sizeof(*a), a, M, devPtrA, M);

        modify (devPtrA, M, N, 1, 2, 16.0f, 12.0f);

        cublasGetMatrix (M, N, sizeof(*a), devPtrA, M, a, M);

        cublasFree (devPtrA);

        cublasShutdown();

        for (j = 0; j < N; j++) {

                for (i = 0; i < M; i++) {

                        printf ("%7.0f", a[IDX2C(i,j,M)]);

                }

                printf ("\n");

        }

 

        return 0;

}

 

 

 

A : Win32 console Project 생성

Win32 console의 Empty 프로젝트를 생성합니다.

 


 

B. 프로젝트 속성 변경

프로젝트의 속석은 크게 3가지를 설정해 주셔야 합니다. header 파일 위치, 추가종속성에 필요한 lib 디렉토리 위치와 lib 파일명.

 

- C/C++ general에 header 디렉토리 추가

헤더파일은 CUDA toolkit이 설치된 디렉토리의 include 파일에 CUBLAS 관련 헤더파일이 존재합니다.


 

실제 소스코드에서는 아래와 같이 cublas.h 헤더파일을 include 합니다.  

#include

#include

#include

#include

 

 

- Linker General에 lib 디렉토리 추가

cuBLAS 라이브러리가 들어있는 CUDA toolkit의 라이브러리 디렉토리인 c:\CUDA\lib 디렉토리를 지정해 줍니다.


 

- Linker Input에 추가 종속성 lib 추가

cuBLAS는 cudart.lib파일이 필요없이 cublas.lib 만으로 작동됩니다. 따라서 cublas.lib만 등록해주면 됩니다.



 

C. 컴파일 및 실행

다음과 같이 정상적으로 컴파일 되고, 정상적인 실행 결과를 확인하실 수 있습니다.

 

 


 

또한, BLAS level I, II, III는 Matlab Plug-in인 Jacket에서도 사용가능합니다. 뿐만 아니라 Jacket 1.2버전은 CULA (CUDA 가속기능의 Lapack)을 내장하고 있기 때문에 유용하게 사용할 수 있습니다. SW메뉴 : Jacket  : 데모예제 를 확인하시면 jacket에서의 BLAS 예제파일을 확인가능합니다.