cuBLAS와 cuBLAS-XT의 조사 (2). 행렬의 곱 연산에서. 전치의 영향.

cuBLSA를 사용하여 GPU에서 행렬의 곱 연산을 수행할 때, 행렬의 곱 연산 함수의 인수에는 입력 행렬의 전치 지정이 있고 전치에 의해 계산 시간에 어떻게 영향을 미치는지 조사했습니다.
조사 결과를 공개합니다.

배경



심층 학습의 이해를 깊게 하기 위해 자전으로 구현을 하고 있으면, 행렬의 곱 연산의 소요 시간을 조금이라도 짧게 하려고 느낍니다. 
BLAS에서의 계산 시간은, 메모리 액세스의 시간을 단축하는 방법의 궁리(캐쉬 메모리에 맞추는, 메모리를 연속적으로 액세스 한다)의 세계가 되어 있다고 상상해, 입력 행렬의 전치에 의해서도, 소요 시간에 영향을 줄 것으로 예상하고 이번 측정했습니다.

행렬의 곱 연산 함수 gemm()



참조 "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 의 정방 행렬(아래 그림)에서, num 을 늘려 갔을 때의 소요 시간으로 비교한다.


  • 측정은 「전치 없음(무인)」 「A만 전치(At)」 「B만 전치(Bt)」 「A, B 모두 전치(AtBt)」의 4종
  • 측정 다음 그래프는 이전 기사 「cuBLAS와 cuBLAS-XT의 조사. 행렬의 곱 연산에서」 에서 유력했다 cuBLAS에서 측정. cuBLAS-XT를 포함한 그래프는 후술.
  • 각 num으로 10회 측정하고, 평균값을 플롯.



  • ↑를 num 4096 이하로 확대한 것이↓



    ↑를 num 2048 이하로 확대한 것이↓



    결과


  • num의 값에 관계없이 "B 전용 전치"가 소요 시간이 가장 짧습니다.
  • 「전치 없음」은 num 이 2000 이하의 근처에서는, 「B만 전치」와 동등. num이 4096을 넘었을 때부터 ~3% 정도의 차이가 생긴다.

  • (「전치 없음」과 「B만 전치」간은 예상보다 차이가 적었다. 「A만 전치」와 「전치 없음」과 같은 차이가, 「전치 없음」과 「B만 전치」간에도 있다 예상했어요)

    →「B만 전치」를 이용하는 것이 좋을 것 같다.

    cuBLAS-XT를 포함한 비교




  • 짧은 소요 시간에서 "cublas (B 전용 전치)", "cublasXt (B 전용 전치)", "cublas (전치 없음)", "cublasXt (전치 없음)".
  • "B만 전치"해도, cuBLAS-XT보다 cuBLA가 약간 소요 시간이 짧다. (그래픽 카드가 1 장인 경우)

  • 구현 이야기



    BLAS로 취급하는 행렬은 Column 우선(열 우선)의 메모리 배치.



    이미지 등에서 자주 사용하는 Row와는 방향이 다르므로 주의가 필요.

    col 우선으로 B 전치! ? 메모리에 어떻게 배치합니까?



    Row 우선 표기로 ↓의 배치.



    특징


  • M과 P의 공통항은 모두 행수가 된다. ( 어느 쪽이 어느 쪽에서의 고민이 하나 줄어든다)
  • M과 P, 어느 것을 A로 할 것인지에 의해, 결과의 전치를 조정할 수 있다.

  • 이것은 이것에서 편리할 것 같다. (잘 됐어요)

    검산 했니?



    오히려 결과에서 역산했습니다 ....
    入力:
    --- 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 
    

    좋은 웹페이지 즐겨찾기