我在尝试使用Julia,遇到了一个与编译器/JIT编译方案有关的问题。如果我编写了一个函数,例如:
然后,当我们使用
Julia确实允许
function f(x)
return mapreduce(*,+,x,x)
end
由于这个函数适用于抽象数组,所以在使用前不可能知道其形状,因此无法编译。如果在函数 g
中使用它,该函数的输入应为浮点数数组的数组,如下所示:
function g(y)
return mapreduce(f,+,y)
end
或者,另一种选择是
function g2(y)
res = 0
for x in y
res = res + f(x)
end
return res
end
然后,当我们使用
g
时,比如说g([[1,2],[3,4]])
,最终会调用f
函数。假设它首先在[1,2]
上被调用,然后被编译和评估。在我看来,由于f([3,4])
与f([1,2])
具有完全相同的类型,即都是二维数组,因此f
将被重用。但是,当我输入@code_llvm(f([1,2]))
和@code_llvm(f([3,4]))
时,我发现函数名称是不同的(它们有一个共同前缀,类似于julia_f_
,后面跟着一个数字)。此外,如果我再次调用@code_llvm(f([1,2]))
,我会得到另一个名称。Julia确实允许
g
对于每个应用程序重复使用已编译版本的f
函数吗?这是否取决于涉及的数组长度;即在g([w1,...,wn])
中,每个wi
是否都必须具有相同的长度才能重复使用f
函数?
@code_llvm
查看实现的副作用)。那些内部函数名称并不准确反映Julia在实践中的操作。 - mbauman