cuBLAS와 cuBLAS-XT의 조사 (2). 행렬의 곱 연산에서. 전치의 영향.
5819 단어 프로그래밍DeepLearningCUDABLAS기계 학습
조사 결과를 공개합니다.
배경
심층 학습의 이해를 깊게 하기 위해 자전으로 구현을 하고 있으면, 행렬의 곱 연산의 소요 시간을 조금이라도 짧게 하려고 느낍니다.
BLAS에서의 계산 시간은, 메모리 액세스의 시간을 단축하는 방법의 궁리(캐쉬 메모리에 맞추는, 메모리를 연속적으로 액세스 한다)의 세계가 되어 있다고 상상해, 입력 행렬의 전치에 의해서도, 소요 시간에 영향을 줄 것으로 예상하고 이번 측정했습니다.
행렬의 곱 연산 함수 gemm()
참조 "cuda tool kit documentation cublasgemm()"
gemm_sample.ccublasSgemm(
handle,
CUBLAS_OP_N, //行列A 転置有無
CUBLAS_OP_N, //行列B 転置有無
num, // 行列Aの行数
num, // 行列Bの列数
num, // 行列Aの列数(=行列Bの行数)
&alpha, // 行列の積に掛ける値(なければ1)
devA, // 行列A
num, // 行列Aの行数
devB, // 行列B
num, // 行列Bの行数
&beta, // 行列Cに掛けるスカラ値(なければ0)
devC, // 行列Cの初期値 兼 出力先
num // 行列Cの行数
);
↑의 행렬A와 행렬B의 전치 유무의 인수를,
값
의미
CUBLAS_OP_N
전치 없음
CUBLAS_OP_T
전치 있음
의 값을 지정하여 전치의 유무를 지정합니다.
전치에 의한 소요 시간
참조 "cuda tool kit documentation cublasgemm()"
gemm_sample.c
cublasSgemm(
handle,
CUBLAS_OP_N, //行列A 転置有無
CUBLAS_OP_N, //行列B 転置有無
num, // 行列Aの行数
num, // 行列Bの列数
num, // 行列Aの列数(=行列Bの行数)
&alpha, // 行列の積に掛ける値(なければ1)
devA, // 行列A
num, // 行列Aの行数
devB, // 行列B
num, // 行列Bの行数
&beta, // 行列Cに掛けるスカラ値(なければ0)
devC, // 行列Cの初期値 兼 出力先
num // 行列Cの行数
);
↑의 행렬A와 행렬B의 전치 유무의 인수를,
값
의미
CUBLAS_OP_N
전치 없음
CUBLAS_OP_T
전치 있음
의 값을 지정하여 전치의 유무를 지정합니다.
전치에 의한 소요 시간
↑를 num 4096 이하로 확대한 것이↓
↑를 num 2048 이하로 확대한 것이↓
결과
(「전치 없음」과 「B만 전치」간은 예상보다 차이가 적었다. 「A만 전치」와 「전치 없음」과 같은 차이가, 「전치 없음」과 「B만 전치」간에도 있다 예상했어요)
→「B만 전치」를 이용하는 것이 좋을 것 같다.
cuBLAS-XT를 포함한 비교
구현 이야기
BLAS로 취급하는 행렬은 Column 우선(열 우선)의 메모리 배치.
이미지 등에서 자주 사용하는 Row와는 방향이 다르므로 주의가 필요.
col 우선으로 B 전치! ? 메모리에 어떻게 배치합니까?
Row 우선 표기로 ↓의 배치.
특징
이것은 이것에서 편리할 것 같다. (잘 됐어요)
검산 했니?
오히려 결과에서 역산했습니다 ....
入力:
--- M ---
mem:[ 1.0000 ,2.0000 ,3.0000 ,4.0000 ,5.0000 ,6.0000 ,7.0000 ,8.0000 ,9.0000 ]
1.0000 2.0000 3.0000
4.0000 5.0000 6.0000
7.0000 8.0000 9.0000
--- P ---
mem:[ 0.0001 ,0.0010 ,0.0100 ,0.1000 ,1.0000 ,10.0000 ,100.0000 ,1000.0000 ,10000.0000 ]
0.0001 0.0010 0.0100
0.1000 1.0000 10.0000
100.0000 1000.0000 10000.0000
結果:
--- M×Pt ---
mem:[ 700.4001 ,800.5002 ,900.6003 ,7004.0010 ,8005.0020 ,9006.0030 ,70040.0100 ,80050.0200 ,90060.0300 ]
700.4001 800.5002 900.6003
7004.0010 8005.0020 9006.0030
70040.0100 80050.0200 90060.0300
--- P×Mt ---
mem:[700.4001 ,7004.0010 ,70040.0100 ,800.5002 ,8005.0020 ,80050.0200 ,900.6003 ,9006.0030 ,90060.0300 ]
700.4001 7004.0010 70040.0100
800.5002 8005.0020 80050.0200
900.6003 9006.0030 90060.0300
Reference
이 문제에 관하여(cuBLAS와 cuBLAS-XT의 조사 (2). 행렬의 곱 연산에서. 전치의 영향.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/t-tkd3a/items/098f51c2cc40a5bddc38텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)