AVX intrinsics类型转换疑问:两种AVX2转换方式的零延迟假设
AVX2两种类型转换的延迟问题解答
好问题!咱们来拆解一下这两种AVX2类型转换的细节:
两种写法的本质等价性
首先明确:(__m256d)b(版本1)和_mm256_castsi256_pd(b)(版本2)在编译后的机器码层面是完全一致的,都是零延迟的寄存器重命名操作。
硬件上,__m256i、__m256d都是对应256位的YMM寄存器,这两种转换只是告诉编译器“把这个寄存器的类型解读从整数向量改成双精度浮点向量”,完全不会生成任何需要执行单元处理的指令——硬件根本不需要做任何实际操作,只是换了个“标签”而已。
关于版本1的延迟
版本1的运行时延迟确实是零。英特尔手册专门标注版本2的延迟为零,是因为_mm256_cast*这类 intrinsics 的语义就是专门用来表达这种无代价的类型转换,而C风格的强制转换在其他场景下可能有不同行为,但在相同宽度的SIMD寄存器之间转换的场景里,编译器会直接把它优化成和cast intrinsics完全一样的零延迟操作,不会有任何性能差异。
任意类型转换都零延迟吗?
这里要划个重点:只有相同宽度的SIMD寄存器之间的转换才是零延迟:
- 比如
__m256i ↔ __m256d ↔ __m256这类256位寄存器之间的互转,不管用哪种写法,都是零延迟; - 但如果是不同宽度的转换(比如
__m128i转__m256d),就需要执行扩展指令(比如vpmovzxwd),这类操作是有实际计算的,会产生延迟,不属于零延迟的类型转换范畴。
内容的提问来源于stack exchange,提问作者tangy
相关产品推荐
相关产品推荐

