基于Numba的GPU数组操作:矩阵转置与性能优化问询
Numba CUDA 设备数组操作疑问与性能分析
一、设备数组输出测试
之前以为GPU无法输出内容,因为在@cuda.jit函数内调用print无效,但测试发现调用A_gpu.shape能直接输出结果。以下是测试代码:
import numpy as np from numba import cuda A = np.random.randn(1000, 1000) A_gpu = cuda.to_device(A)
执行以下操作及对应输出:
A_gpu.shape→ 输出:(1000, 1000)A_gpu[0][0]→ 输出:0.4253498653987585A_gpu.T→ 输出:<numba.cuda.cudadrv.devicearray.DeviceNDArray at 0x7f5de810ffa0>
疑问:要在控制台输出GPU上的数据,是否必须先将数据拷贝到CPU?
二、CPU与GPU操作性能对比
执行以下性能测试代码:
%timeit A.T %timeit A_gpu.T %timeit A.shape %timeit A_gpu.shape %timeit A[0][0] %timeit A_gpu[0][0]
测试结果:
132 ns ± 18.9 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each) 159 ms ± 29.3 ms per loop (mean ± std. dev. of 7 runs, 10 loops each) *76 ns* ± 2.37 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each) *47.8 ns* ± 8.81 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each) 376 ns ± 146 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each) 161 µs ± 25.7 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
从结果可见:
- GPU上调用
shape比CPU更快 - 转置、单个元素访问操作,GPU比CPU慢,但
@cuda.jit内核内的元素访问可能已做优化
三、核心问题:神经网络反向传播中的矩阵转置策略
目前正在实现用于神经网络反向传播的CUDA矩阵乘法内核,需频繁执行dL_dX = np.dot(dL_dY, self.weights.T)这类操作,有两个疑问:
- 在GPU内直接转置矩阵(如
matrix_multiplication_gpu[blocks_per_grid, threads_per_block](A_gpu, B_gpu.T))是否属于不良实践? - 是否先在CPU转置矩阵再将结果传入GPU(
cuda.to_device(A.T))性能更优?
测试发现后者耗时仅2.41 ms ± 145 µs,远快于GPU内转置。
内容的提问来源于stack exchange,提问作者BPDev
相关产品推荐
相关产品推荐

