You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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.4253498653987585
  • A_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)这类操作,有两个疑问:

  1. 在GPU内直接转置矩阵(如matrix_multiplication_gpu[blocks_per_grid, threads_per_block](A_gpu, B_gpu.T))是否属于不良实践?
  2. 是否先在CPU转置矩阵再将结果传入GPU(cuda.to_device(A.T))性能更优?

测试发现后者耗时仅2.41 ms ± 145 µs,远快于GPU内转置。

内容的提问来源于stack exchange,提问作者BPDev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 15:48:30