这是关于编译器的。
编译器是否执行运行时依赖检查以决定将循环向量化?换句话说,编译器是否像在运行时一样通过逻辑进行跟踪,以确定循环是否可以向量化?
是在编译器编译代码时,如果启用了自动向量化(默认),那么输出就是以AVX程序集指令为目标的向量化代码,那么它什么时候执行依赖项检查?
发布于 2015-02-26 18:12:25
对于编译器执行运行时检查(查找编译时找不到的警告和错误,包括循环矢量化),它开始危险地接近停车问题。。
艾伦·图灵在1936年证明了解决所有可能的程序输入对停止问题的通用算法是不存在的。证明的一个关键部分是计算机和程序的数学定义,它被称为图灵机;停止问题在图灵机器上是无法判定的。这是决策问题的第一个例子之一。
考虑以下Java程序:
public class Halting {
public static void main(String... args) {
while(isCondition()) {
}
}
private static boolean isCondition() {
return true;
}
}此程序不返回编译器的错误或警告。它必须通过逻辑跟踪才能看到它是一个无限循环。怎样才能阻止理论运行时检查器以同样的方式陷入无限循环中呢?编译器不能被困在无限循环中,它不够聪明。
另一方面,请注意,这确实有一个错误:
public class Halting {
public static void main(String... args) {
String foo = null;
System.out.println(foo.charAt(0));
}
}这就产生了警告:
空指针访问:变量foo只能在此位置为空。
这样的检查是编译器能做的最好的。但请注意,这没有任何警告,即使这是相同的问题:
public class Halting {
public static void main(String... args) {
String foo = getFoo();
System.out.println(foo.charAt(0));
}
private static String getFoo() {
return null;
}
}发布于 2015-02-26 18:46:10
我认为没有,但这应该是可能的。例如,gcc 4.8 (向下滚动到IA-32/x86-64部分)具有内置的__builtin_cpu_supports函数和函数多版本控制支持,开发人员可以使用它为不同的体系结构编写不同的代码。我不明白为什么编译器不能自动使用这些特性生成依赖于运行时的不同代码页。
例如,手动:
__attribute__ ((target ("default")))
int foo(void)
{
return 1;
}
__attribute__ ((target ("sse4.2")))
int foo(void)
{
return 2;
}
int main (void)
{
int (*p) = &foo;
assert ((*p)() == foo());
return 0;
}https://softwareengineering.stackexchange.com/questions/274547
复制相似问题