2014-07-09 5 views
0

CUBLAS 라이브러리 (cublasSgeam 함수 사용)를 사용하여 행렬 전치 연산을 병렬 처리하려고합니다. 출력 데이터가 정확하지만, 내 CPU 버전보다 시간이 더 걸립니다. 평균은 입니다. 왜? (M=140 의해 N = 5000의 행렬을 전치)CUBLAS에서 매우 느린 행렬 전치 연산

CPU 코드 (M=140 의해 N = 5000의 행렬을 전치)

// Starting the timer 
    float *matrixT = (float *) malloc (N * M * sizeof(float)); 
    for (int i = 0; i < N; i++) 
     for (int j = 0; j < M; j++) 
      matrixT[(j*N)+i] = matrix[(i*M)+j]; // matrix is obviously filled 

//Ending the timer 

GPU 코드

float *h_matrixT , *d_matrixT , *d_matrix; 
    h_matrixT = (float *) malloc (N * M * sizeof(float)); 
    cudaMalloc((void **)&d_matrixT , N * M * sizeof(float))); 
    cudaMalloc((void**)&d_matrix , N * M * sizeof(float))); 
    cudaMemcpy(d_matrix , matrix , N * M * sizeof(float) , cudaMemcpyHostToDevice)); 

//Starting the timer 

    const float alpha = 1.0; 
    const float beta = 0.0; 
    cublasHandle_t handle; 
    cublasCreate(&handle); 
    cublasSgeam(handle, CUBLAS_OP_T, CUBLAS_OP_N, N, M, &alpha, d_matrix, M, &beta, d_matrix, N, d_matrixT, N); 
    cublasDestroy(handle); 

//Ending the timer 

    cudaMemcpy(h_matrixT , d_matrixT , N * M * sizeof(float) , cudaMemcpyDeviceToHost)); 


    cudaFree(d_matrix); 
    cudaFree(d_matrixT); 

경과 시간

CUBLAS : 148.461 MS

CPU : 지포스 GTX 660 & 인텔 코어 i5 660

+0

N과 M의 크기는 얼마나됩니까? 또한 타이밍에 cublas 컨텍스트를 생성 할 시간을 포함하고 있다는 점을 고려하십시오. – JackOLantern

+1

변환을 두 번 실행하면 어떻게됩니까? 두 번째 속도가 동일합니까? – talonmies

답변