【发布时间】:2021-01-20 11:00:43
【问题描述】:
我有一些代码,我需要根据应用于较小 cp.array 的 cp.argmin 的结果对较大的 cp.array 进行切片。 (参见下面的最小代码示例)
问题是,cp.argmin 返回一个零维 cp.array,而使用 : 运算符进行切片显然需要整数。
import time
import cupy as cp
original = cp.empty((10000, 10000))
nrows, ncols = 1000, 1000
to_modify = cp.empty((nrows, ncols))
start_time = time.time()
for i in range(10000):
argmin = cp.argmin(to_modify)
argmin = int(argmin)
row_idx, col_idx = (argmin // ncols, argmin % ncols)
sliced = original[row_idx : row_idx + nrows, col_idx : col_idx + ncols]
to_modify += sliced
print(time.time() - start_time)
当我分析上面的代码时(我使用 py-spy),最慢的行(大约 90% 的时间)是转换为 argmin 的 int,但如果我删除它,sliced = original[ ... ] 行将成为最慢的行,因为演员阵容似乎隐含地发生了。
有没有办法以高效的方式解决我的问题,避免切片时对 : 运算符的需求?
【问题讨论】:
标签: cupy