从MATLAB低性能调用内核

时间:2012-11-09 06:08:00

标签: matlab cuda gpu

我从我的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); 

1 个答案:

答案 0 :(得分:1)

你需要给GPU一些真正的工作要做。在您当前的示例中,唯一耗时的操作是将数据复制到GPU并返回。由于CPU不必执行这些步骤,因此它具有明显的优势。尝试例如大矩阵的实矩阵乘法(不是元素乘法)。

在更正式的术语中,您的内核是PCIe带宽限制。为了分摊前后复制 N 元素所花费的时间,您需要执行一些比数据复制要昂贵得多的操作。元素乘法很便宜并且与 N 成线性比例。 N×N - 矩阵的乘法与 N 3 的比例,而数据传输仅与 N 成比例2 ,因此对于足够大的矩阵,GPU上的矩阵乘法将比在CPU上快。