PyTorch中.to(device)与张量操作的顺序是否影响GPU性能?
两种张量操作顺序的性能差异分析(GPU场景)
针对你写出的some_data.unsqueeze(0).to(device)和some_data.to(device).unsqueeze(0)两种写法,当device为GPU时,二者的性能差异可以从操作执行设备和数据传输逻辑两方面拆解:
先执行
unsqueeze(0)再传输到GPU:unsqueeze是视图类操作,仅修改张量的形状元数据,不会复制或改动底层元素,因此在CPU上执行这个操作的开销几乎可以忽略。后续传输到GPU的数据量和原张量完全一致(元素总数未变),传输阶段的开销和第二种写法没有区别。先传输到GPU再执行
unsqueeze(0):
先将原张量传到GPU后,再在GPU端执行维度扩展。GPU执行unsqueeze的开销同样极低,几乎不占用时间。这种写法的潜在优势在于,如果后续还有其他GPU端操作,能让张量更早进入GPU设备,减少CPU-GPU之间的同步等待,但仅针对这两步操作本身,性能差异微乎其微。
需要额外注意的是:如果是repeat这类会实际复制元素的操作,顺序会对性能产生明显影响——先在CPU执行repeat再传输会增加数据传输量,开销更大;而先传输再在GPU执行repeat,利用GPU的并行复制能力,性能会更优。但unsqueeze不属于这类操作,因此不存在这个问题。
内容的提问来源于stack exchange,提问作者PkDrew
相关产品推荐
相关产品推荐

