我从我的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);
答案 0 :(得分:1)
你需要给GPU一些真正的工作要做。在您当前的示例中,唯一耗时的操作是将数据复制到GPU并返回。由于CPU不必执行这些步骤,因此它具有明显的优势。尝试例如大矩阵的实矩阵乘法(不是元素乘法)。
在更正式的术语中,您的内核是PCIe带宽限制。为了分摊前后复制 N 元素所花费的时间,您需要执行一些比数据复制要昂贵得多的操作。元素乘法很便宜并且与 N 成线性比例。 N×N - 矩阵的乘法与 N 3 的比例,而数据传输仅与 N 成比例2 ,因此对于足够大的矩阵,GPU上的矩阵乘法将比在CPU上快。