我正在尝试编译包含一些大型数组(400个元素)的LLVM IR代码。当我尝试用clang编译它时(不运行,只编译) - 它需要超过10分钟。
define i32 @main() {
%j = alloca double
%i = alloca double
%foo = alloca [400 x double]
%B = alloca [400 x [400 x double]]
%A = alloca [400 x [400 x double]]
%1 = insertvalue [400 x double] undef, double 0.000000e+00, 0
%2 = insertvalue [400 x [400 x double]] undef, [400 x double] %1, 0
store [400 x [400 x double]] %2, [400 x [400 x double]]* %A
%3 = insertvalue [400 x double] undef, double 0.000000e+00, 0
%4 = insertvalue [400 x double] undef, double 0.000000e+00, 0
%5 = insertvalue [400 x [400 x double]] undef, [400 x double] %4, 0
store [400 x [400 x double]] %5, [400 x [400 x double]]* %B
%6 = insertvalue [400 x double] undef, double 0.000000e+00, 0
store [400 x double] %6, [400 x double]* %foo
store double 0.000000e+00, double* %i
ret i32 0
}
要运行的命令:clang out.ll -o built
我认为这与clang尝试创建数组或其他东西有关。当我制作更大的数组时,clang构建需要更长的时间,但运行程序需要大约相同的时间。对我来说,为什么会发生这种情况并没有多大意义,但看起来确实如此。
LLVM:Apple LLVM version 9.0.0 (clang-900.0.39.2)
Clang:clang version 6.0.0 (tags/RELEASE_600/final)
(从评论中添加) 如何让这花费更少的时间? ......这需要很长时间,这似乎很奇怪。我知道有一种方法可以减少时间,因为,例如,C能够使数组变得很大,并且可以立即编译。
我尝试实现malloc
以便在堆上而不是堆栈上分配数组。这是一些新的IR代码。我的问题是这是分配到哪里的?当我生成多维数组时,它仍然非常慢 - 在这种情况下,我将如何再次加速它?
%foo = alloca [400 x [400 x double]]
%calltmp1 = call i8* @malloc(i64 10240000)
%4 = bitcast i8* %calltmp1 to [400 x [400 x double]]*
%5 = getelementptr [400 x [400 x double]], [400 x [400 x double]]* %4, i32 0, i32 0
%calltmp2 = call i8* @malloc(i64 25600)
%6 = bitcast i8* %calltmp2 to [400 x double]*
%7 = getelementptr [400 x double], [400 x double]* %6, i32 0, i32 0
store double 1.000000e+00, double* %7
%8 = getelementptr [400 x double], [400 x double]* %6, i32 0, i32 1
store double 1.000000e+00, double* %8
%9 = getelementptr [400 x double], [400 x double]* %6, i32 0, i32 1
store double 1.000000e+00, double* %9
%initialized_array3 = load [400 x double], [400 x double]* %6
store [400 x double] %initialized_array3, [400 x double]* %5
%initialized_array4 = load [400 x [400 x double]], [400 x [400 x double]]* %4
store [400 x [400 x double]] %initialized_array4, [400 x [400 x double]]* %foo
很抱歉所有的修改,但我认为额外的信息是有帮助的。
以下是我生成的更多IR代码:
%foo = alloca [400 x [400 x double]]
store [400 x [400 x double]] undef, [400 x [400 x double]]* %foo
%0 = getelementptr [400 x [400 x double]], [400 x [400 x double]]* %foo, i32 0, i32 0
%1 = getelementptr [400 x double], [400 x double]* %0, i32 0, i32 0
store double 1.598000e+03, double* %1
几乎与此{1}}生成的IR代码相同:
c
然而, %1 = alloca [400 x [400 x i32]], align 16
%2 = alloca i32*, align 8
%3 = getelementptr inbounds [400 x [400 x i32]], [400 x [400 x i32]]* %1, i64 0, i64 0
%4 = getelementptr inbounds [400 x i32], [400 x i32]* %3, i64 0, i64 0
store i32 1, i32* %4, align 16
代码在不到一秒的时间内编译,而我的代码需要太长时间才能分辨出来。这是因为第一个代码段中的第2行(下面是参考)。为什么这会导致铿锵声如此缓慢?
线减慢速度:
c