【发布时间】:2020-08-23 02:20:27
【问题描述】:
我的输入是一个值列表,data_idx。在示例中,值的范围为 [0, 5]。
data_idx = [2, 5, 5, 0, 4, 1, 4, 5, 3, 2, 1, 0, 3, 3, 0]
我想要的输出 filled_matrix 是一个形状为 max(value) 的张量 len(data_idx) ,其中张量的每一行 r 包含所有索引,其中 data_idx == r 和 -1 表示该行的其余部分如果匹配索引的数量少于len(data_idx)
例如,在第一行中,r=0、data_idx==0 在索引 [3, 11, 14] 处。完整的输出如下所示:
filled_matrix = tensor([[ 3, 11, 14, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
[ 5, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
[ 0, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
[ 8, 12, 13, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
[ 4, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
[ 1, 2, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]],
dtype=torch.int8)
我有可以实现我的目标的循环代码。
import torch
max_idx = 6
data_idx = torch.tensor([2, 5, 5, 0, 4, 1, 4, 5, 3, 2, 1, 0, 3, 3, 0]).cuda()
max_number_data_idx = data_idx.shape[0]
filled_matrix = torch.zeros([max_idx, max_number_data_idx], dtype=torch.int8, device='cuda')
filled_matrix.fill_(-1)
for i in range(max_idx):
same_idx = (data_idx == i).nonzero().flatten()
filled_matrix[i][:same_idx.shape[0]] = same_idx
现在,我想加快这段代码的速度。具体来说,我希望它在 GPU 上更快。在实际场景中,输入data_idx 可以是包含数百万个值的列表。在这种情况下,例如 1 M 的不同值,GPU 将被调用 1 M 的时间,这使得它非常慢。我的代码是顺序的,GPU 讨厌顺序代码。
是否有一个函数可以更有效地产生相同的结果?或者一种向量化这个 for 循环的方法?
【问题讨论】:
-
你能解释一下你的目标是什么,什么是行不通的吗?例如,您想要的输出是什么?你会得到什么?
-
感谢您的回答,我的输出是“填充矩阵”。我想找到一种在 GPU 上优化此代码并具有相同输出的方法
-
所以澄清一下,这段代码在 gpu 上做了你想要的,现在你想把它移到 cpu 上?
-
两者都有效。我只想为 gpu 优化它。下面的代码只是一个例子。在实际场景中,输入 data_idx 可以是包含数百万个值的列表。在这种情况下,例如 1 M 的不同值,GPU 将被调用 1 M 的时间,这使得它非常慢。我的代码是顺序的,gpu 讨厌顺序代码。所以对我来说,第一个选择要么尝试找到一种方法来避免使用循环(可能有一个我不知道的隐藏 pytorch 函数),要么找到一种方法来并行化循环。再次感谢您
-
根据您的 cmets,我尝试重新编写您的问题以使其更清晰。希望这将帮助您获得所需的答案。
标签: optimization pytorch gpu