我想将cupy.linalg.pinv函数应用于100 k数组,但与Numpy等效函数相比,我看到性能下降。
我的100 k数组是二维数组。主阵列形状为:(100000,1397,2)
# generating the data
arr = np.random.uniform(low=0.5, high=1500.20,size=(1397, 2))
main_arr = np.tile(arr, (100000, 1, 1))
使用NumPy,该函数在11秒内运行:
%%time
np.linalg.pinv(main_arr)
CPU时间:用户22.5秒,系统:27.4秒,总计:49.9 s壁时间:11秒
在GPU上使用Cupy的确切等效值会产生错误:
main_arr_gpu = cp.array(main_arr) # Copy the array to the GPU
cp.linalg.pinv(main_arr_gpu)
LinAlgError:给定的三维数组。数组必须是二维的
所以我使用列表解析来遍历数组:
%%time
[cp.linalg.pinv(arr_gpu) for arr_gpu in main_arr_gpu]
CPU时间:用户22.3秒,系统:0 ns,总计:22.3 s壁时间:22.3秒
它需要22.3s,是CPU时间的两倍,不计算数据传输。Nvidia-smi命令确认GPU正在工作。
那么为什么CPU的性能更好呢?
- 注意:CPU为Intel 24 Core 13900 k,GPU为Nvidia RTX 4090*
2条答案
按热度按时间7gcisfzg1#
这是我使用的Cupy版本的known issue:v8.现在Cupy v12使用broadcasting,因此它具有与NumPy完全相同的行为。
CPU时间:用户12.7秒,系统:0 ns,总计:12.7 s壁时间:12.7秒
几乎是同样的执行时间。我相信我的阵列不够大,无法注意到重大改进。
从conda-forge安装:
conda install -c conda-forge cupy=12.0.0
t8e9dugd2#
你看到的表演并不令人惊讶。逆运算不像矩阵乘法那样容易并行化,因此在切换到GPU时,您通常看不到任何性能增益。
在这里您可以看到您的经验已被其他benchmarking共享。
这也是通常用于科学计算的“传统”计算集群更喜欢高内核数而不是GPU的部分原因