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
N과 M의 크기는 얼마나됩니까? 또한 타이밍에 cublas 컨텍스트를 생성 할 시간을 포함하고 있다는 점을 고려하십시오. – JackOLantern
변환을 두 번 실행하면 어떻게됩니까? 두 번째 속도가 동일합니까? – talonmies