C _mm256_undefined_si256的可能用途是什么?

C _mm256_undefined_si256的可能用途是什么?,c,simd,intrinsics,avx,avx2,C,Simd,Intrinsics,Avx,Avx2,Intel提供了一个名为的内部函数,它返回带有未定义元素的_m256i类型的向量 在中,这总是返回未定义的值,并且通常导致根据其值优化掉所有代码路径 我的问题是:这个内在函数有什么可能的用途?有时候你不关心指令的输入,因为它实际上并不重要(典型的例子是xor%reg,%reg,不管%reg中以前的值是多少,结果都是零;或者nor/nand%reg,%reg,结果都是零,不管%reg中以前的值是多少)。我怀疑内在特性允许在C/C++中不存在未定义的行为的情况下实现这一点。英特尔有一个简短的解释和一

Intel提供了一个名为的内部函数,它返回带有未定义元素的_m256i类型的向量

在中,这总是返回未定义的值,并且通常导致根据其值优化掉所有代码路径


我的问题是:这个内在函数有什么可能的用途?

有时候你不关心指令的输入,因为它实际上并不重要(典型的例子是
xor%reg,%reg
,不管
%reg
中以前的值是多少,结果都是零;或者
nor/nand%reg,%reg
,结果都是零,不管
%reg
中以前的值是多少)。我怀疑内在特性允许在C/C++中不存在未定义的行为的情况下实现这一点。英特尔有一个简短的解释和一个示例一个用例通过
\u mm\u cmpeq\u epi32(x,x)生成一个全一向量
,其中
x
的内容无关紧要。@AndreySemashev:用这种方式欺骗编译器通常不是一个好主意,除非你试图解决一些其他遗漏的优化问题,比如愚蠢的常数传播,以便在一条额外指令中加载它可以从所有指令派生的内容。
\u mm\u set1\u epi32(-1)
将使用
pcmpeqd same,same
与任何像样的编译器配合使用。@PeterCordes它不是在“欺骗编译器”,此序列使用内部指令和底层指令的定义良好的行为。例如,根据我使用gcc的经验,它将
\u mm\u set1\u epi32
和类似的内部指令转换为内存中的加载,其中放置了预生成的常量。我没有使用
-1
测试特定情况,也没有测试它是否生成在这种情况下,de>pcmpeqd很好。但是明确使用
\u mm\u cmpeq\u epi32
也不会导致无效。