LLVM 中的向量加法程序

Posted

技术标签:

【中文标题】LLVM 中的向量加法程序【英文标题】:Vector Addition Program in LLVM 【发布时间】:2013-06-07 16:51:40 【问题描述】:

我正在尝试在 LLVM 中编写一个 5 元素向量加法程序,但不知道如何返回整个结果向量。我的代码如下,错误是

LLVM 错误:提供的 main() 的返回类型无效

@veca = global [5 x i32] [i32 1, i32 2, i32 3, i32 4, i32 5]
@vecb = global [5 x i32] [i32 4, i32 6, i32 9, i32 2, i32 4]

define [5 x i32]* @vector_add([5 x i32]* %vec1, [5 x i32]* %vec2)

    entry:
    %vecc = alloca [5 x i32]
    br label %loop

    loop:
    %i  = phi i32 [0, %entry], [%nexti, %loop]
    %nexti = add i32 %i, 1
    %ptra = getelementptr [5 x i32]* %vec1, i64 0, i32 %i
        %loada = load i32* %ptra
    %ptrb = getelementptr [5 x i32]* %vec2, i64 0, i32 %i
    %loadb = load i32* %ptrb
    %added = add i32 %loada, %loadb
    %ptr = getelementptr [5 x i32]* %vecc, i32 0, i32 %i
    store i32 %added, i32* %ptr
    %eq = icmp eq i32 %i, 4
    br i1 %eq, label %loop, label %exit

    exit:
    ret [5 x i32]* %vecc


define [5 x i32] @main()

    %answer = call [5 x i32]* @vector_add([5 x i32]* @veca, [5 x i32]* @vecb)
    %ans = load [5 x i32]* %answer
    ret [5 x i32] %ans

【问题讨论】:

【参考方案1】:

这个 IR 本身并没有什么问题 - 它与 llc 编译得很好。您的问题可能在于尝试 JIT 或解释它,因为 LLVM ExecutionEngine 需要具有标准签名的 main

int main()

【讨论】:

我用 llvm-as vector-add.ll 编译并用 lli vector-add.bc 运行,然后产生了错误。我应该在 linux 终端中运行什么才能让它正确运行? 我也可以打印答案而不是返回它。在这种情况下,我可以使用:'declare i32 @main() .... @puts..... return 0`。在这种情况下,你知道如何使用@puts 打印 5 个整数吗? @FCo:做这些事情的一个简单方法是用clang编译C代码的小sn-ps并研究它产生的IR

以上是关于LLVM 中的向量加法程序的主要内容,如果未能解决你的问题,请参考以下文章

TVM1 介绍/Ubuntu安装/向量加法转置举例

LLVM IR:有效地对向量求和

[PTA]习题9-3 平面向量加法

[PTA]实验9-10 平面向量加法

从 bool (i1) 向量到 i8、i16 等的 LLVM 位转换是不是定义明确?

使用 Cuda 进行 128 位向量加法,性能问题