3

MATLAB 実装から CUDA カーネルを呼び出しました。ただし、CPU の結果は GPU の実装よりも高速です。行列が大きいほどパフォーマンスが向上することはわかっていますが、大きなサイズも試してみると、GPU のパフォーマンスが低下します。

結果は次のとおりです。 CPU: 0.000006 GPU: 0.00134 私のカーネルと MATLAB コードは次のとおりです。

前もって感謝します!

matrix.cu

__global__ void matrix_mult2(double *A, double *B, double * C) {
   int x =  threadIdx.x;

C[x] = A[x] * B[x];


}



main.m
kernel = parallel.gpu.CUDAKernel( 'matrix_mult2.ptx', ...
                              'matrix_mult2.cu' );


kernel.ThreadBlockSize = [25,1,1];
kernel.GridSize = [1,1];


A = parallel.gpu.GPUArray.rand(5,5,'double');
B = parallel.gpu.GPUArray.rand(5,5,'double');
C = parallel.gpu.GPUArray.zeros(5,5);

C = feval(kernel,A,B,C); 
4

1 に答える 1

1

GPUに実際の作業を与える必要があります。現在の例では、時間のかかる操作はデータをGPUにコピーして戻すことだけです。CPUはこれらの手順を実行する必要がないため、ここでは明らかな利点があります。たとえば、大きな行列の実際の行列乗算を試してください(要素ごとの乗算ではありません)。

もう少し正式な言葉で言えば、カーネルはPCIe帯域幅に制限されています。N個の要素を前後にコピーするのに費やした時間を償却するには、データのコピーよりもはるかにコストのかかるいくつかの操作を実行する必要があります。要素ごとの乗算は安価で、 Nに比例してスケーリングします。N×N行列の乗算はN3でスケーリングしますが、データ転送はN 2でのみスケーリングするため十分な大きさの行列の場合、GPUでの行列の乗算はCPUよりも高速になります。

于 2012-11-09T13:16:01.087 に答える