2013-08-22 2 views
1

저는 CUBLAS/CUDA 프로그래밍을 시작했습니다. 저는 주로 행렬과 벡터 연산을 사용합니다. 나는 CUBLAS에서 사용 된 벡터의 방향에 대해 매우 혼란 스럽다. 그것은 행과 열 벡터 사이에 차이가없는 것 같습니다. 따라서 레벨 2 함수를 사용하여 행렬에 벡터를 곱하면 벡터의 방향을 어떻게 지정할 수 있습니까? 항상 열 벡터로 취급됩니까? 열 벡터 (nx1)를 행 벡터 (1xm)에 곱하여 행렬 (nxm)을 만들려면 항상 행렬로 취급하고 곱셈을 위해 레벨 3 함수를 사용해야합니까?CUBLAS의 행/열 벡터에 혼란이 있음

또한 트러스트를 사용하여 벡터를 생성하므로 추력 벡터 (n 요소)를 cublasCgemm에 전달하여 1xn 또는 nx1 행렬 (행 또는 열 벡터)을 형성하면됩니다. cUBLAS_OP_N으로 cublasOperation_t를 설정하면 벡터가 1xn 또는 nx1 벡터로 취급됩니까?

감사합니다.

답변

1

모든 데이터는 단일 포인터, 즉 double*에 저장된다. 그것들은 순차적으로 메모리에 저장됩니다. 행과 열 벡터에는 차이가 없습니다. 단일 포인터는 2D 배열에도 사용됩니다. CUBLAS 당신에게 i이 로우 인 매트릭스

#define IDX2F(i,j,ld) ((((j)-1)*(ld))+((i)-1)) 

에서 쉽게 찾을 정의 요소를 제공 j 열이고 ld 매트릭스의 주요 치수이다. ld은 작업에서 전체 행렬의 부분 행렬을 사용하려는 경우에 사용됩니다.

승산 (NX1) (1xm) = (N × M 개의)의 cublasDger 함수에 의해 수행된다.

cublasStatus_t cublasDger은 (cublasHandle_t 핸들 INT의 m은 N INT, CONST 이중 * (α), CONST 이중 * X, INT의 incx, CONST 이중 * y를, INT의 incy, 이중 * A, INT의 LDA) 경우 예를 들어 y이 (kxm) 행렬의 일부인 경우 incy=k을 사용하십시오.

+0

도움이됩니다. 나는 cublasDger가 내가 필요한 것이라고 생각한다. 그러나 저장 형식에 대해 매우 혼란 스럽습니다. CUBLAS 사용에 대한 소개를 읽었습니다. 그것은 C가 포트란과 다른 저장 포맷을 가지고 있다고 말했다. 그래서 C 형식으로 저장하는 C (mxk) = A (mxn) x B (nxk)를 곱하면 cublasDgemm에 넣어야하는 주요 차원은 무엇입니까? – user1285419

+0

당신은 내 대답에 관심이있을 수 있습니다 [여기] (http://stackoverflow.com/questions/18252526/matrix-multiplication-giving-wrong-output/18292753#18292753) C와 CUBLAS의 GEMM를 사용하여 완전히 일 예를 제공하는 스타일 2D 배열. –

+0

은 키트에 _CUDA Documentation_ [CUBLAS/데이터 레이아웃 (http://docs.nvidia.com/cuda/cublas/index.html#data-layout) CUBLAS 라이브러리는 기존 포트란과 최대한 호환성을 열 주요 스토리지를 사용한다고 환경. 또한 제안되어 있습니다 : _ 기계적으로 C로 포팅 된 Fortran 코드의 경우, 루프를 변환 할 필요가 없도록 1 기반 인덱싱을 유지할 수도 있습니다. 따라서 BLAS에 관해서는 컬럼 - 주요 스토리지 (Fortran) 포맷을 선택하는 것이 현명한 선택입니다. 그렇지 않으면 cublasDgemm을 호출하기 전에 모든 행렬을 C에서 Fortran으로 변환해야합니다. – ztik

관련 문제