为何torch.fft.rfft(x)比指定out参数的torch.fft.rfft(x, out=y)执行更快?
为何torch.fft.rfft(x)比指定out参数的torch.fft.rfft(x, out=y)执行更快?
我之前也碰到过类似的疑惑,本来想着手动指定输出张量能省内存分配的时间,结果反而变慢了,后来摸清楚底层实现的细节才明白原因,主要是这几个点:
内存对齐拖了后腿:PyTorch的FFT依赖FFTW或者MKL这类底层库,这些库对内存地址是特定倍数(比如64字节或128字节)对齐的张量有专门的加速优化。当你让PyTorch自动创建输出时,它会直接按照底层库要求的最优对齐方式分配内存;但你手动用
torch.zeros创建的y,默认的内存分配逻辑不一定满足这个对齐要求,导致底层库只能用没有优化的通用计算路径,速度自然就下来了。张量布局不匹配:PyTorch在自动生成输出张量时,会根据输入
x的设备、数据类型,甚至当前的计算上下文(比如CPU的线程配置、是否启用AVX2这类加速指令)来选择最适合FFT计算的张量布局。而你手动创建的y只是一个普通的全零复数张量,它的内存布局可能和FFT操作预期的最优布局不兼容,底层需要额外做内存格式转换,这部分开销反而抵消了“避免内存分配”节省的时间。内存分配的开销其实可以忽略:你用的输入长度是200万,对应的输出张量大小是100万+1个complex64元素,算下来也就8MB左右的内存。现代操作系统分配这么点内存的时间非常短,几乎可以被FFT的计算时间掩盖。反而因为对齐和布局问题导致的计算速度下降,影响要大得多。
简单来说,“指定out参数更高效”的前提是你手动创建的张量完全符合底层计算的所有要求,如果没踩中这些细节,反而会适得其反。
备注:内容来源于stack exchange,提问作者Mistergrave
相关产品推荐
相关产品推荐

