赞
踩
Mojo是一种具有广泛现代功能的高级编程语言。Mojo还为程序员提供了访问所有底层原语的机会,以便编写强大而零成本的抽象。
这些原语用MLIR实现,MLIR是一种用于编译器设计的可扩展中间表示格式。许多不同的编程语言和编译器将它们的源程序翻译成MLIR,因为Mojo提供了直接访问MLIR特性的途径,这意味着Mojo程序可以享受这些工具带来的好处。
更进一步,Mojo独特的零成本抽象与MLIR互操作性的组合意味着Mojo程序可以充分利用任何与MLIR接口的东西。虽然这不是普通的Mojo程序员可能需要做的事情,但当扩展系统以与新数据类型接口或深奥的新加速器功能时,这是一个非常强大的功能。
为了说明这些想法,我们将在下面的Mojo中实现一个布尔类型,我们称之为OurBool。我们将广泛使用MLIR,所以让我们从一个简短的入门介绍开始。
MLIR是一种程序的中间表示,与汇编语言类似,在汇编语言中,一组顺序的指令操作于内存中的值。
更重要的是,MLIR是模块化和可扩展的。MLIR由越来越多的“方言”组成。每个方言都定义了操作和优化:例如,math
方言提供了数学操作,如正弦和余弦,amdgpu
方言提供了特定于AMD处理器的操作,等等。
MLIR的每种方言都可以与其他方言互操作。这就是为什么说MLIR可以解锁异构计算:随着更新、更快的处理器和体系结构的开发,新的MLIR方言被实现,以为这些环境生成最佳代码。任何新的MLIR方言都可以无缝翻译为其他方言,因此随着更多的添加,所有现有的MLIR变得更加强大。
这意味着我们自己的自定义类型,例如我们将在下面创建的OurBool类型,可以用来为程序员提供一个高级的、类似python的接口。但在“表面之下”,Mojo和MLIR将为未来出现的每个新处理器优化我们的方便、高级类型。
关于为什么MLIR是一项革命性的技术还有很多可以写,但让我们回到Mojo和定义OurBool类型。在这个过程中,我们将有机会了解更多关于MLIR的知识。
我们可以使用Mojo的struct关键字来定义一个新类型OurBool:
struct OurBool:
var value: __mlir_type.i1
布尔值可以表示0或1,“true”或“false”。为了存储这些信息,OurBool有一个成员,称为value。它的类型直接在MLIR中表示,使用MLIR内置类型i1。事实上,在Mojo中可以使用任何MLIR类型,只要在类型名称前加上__mlir_type即可。
正如我们将在下面看到的,用i1表示我们的布尔值将允许我们利用与i1类型接口的所有MLIR操作和优化——它们有很多!
定义了OurBool之后,我们现在可以声明这种类型的变量:
fn uninitialized_our_bool():
var a: OurBool
当然,我们接下来可能会尝试创建一个OurBool实例。然而,此时尝试这样做会导致错误:
var a = OurBool() # error: 'OurBool' does not implement an '__init__' method
与在Python中一样,__init__是一个特殊方法,可以定义它来自定义类型的行为。我们可以实现一个没有参数的__init__方法,并返回一个带有“false”值的OurBool。
struct OurBool:
var value: __mlir_type.i1
fn __init__(inout self):
self.value = __mlir_op.`index.bool.constant`[
value=__mlir_attr.false,
]()
为了初始化基础的i1值,我们使用来自其index
方言的MLIR操作,称为index. boolean .constant。
MLIR的index
方言为我们提供了操作内置MLIR类型的操作,例如我们用来存储OurBool值的i1。index. boolean .constant操作接受一个编译时常量true或false作为输入,并在运行时生成一个i1类型的输出。
因此,如上所示,除了任何MLIR类型之外,Mojo还通过__mlir_op前缀直接访问任何MLIR操作,通过__mlir_attr前缀直接访问任何属性。MLIR属性用于表示编译时常量。
正如你在上面看到的,与MLIR交互的语法并不总是那么漂亮:MLIR属性在方括号之间传递[…],操作通过后缀(…)的括号执行,它可以接受运行时参数值。然而,大多数Mojo程序员不需要直接访问MLIR,对于少数需要访问的人来说,这种“丑陋”的语法给了他们超能力:他们可以定义易于使用的高级类型,但在内部插入MLIR及其强大的方言系统。
我们认为这非常令人兴奋,但让我们回到现实:定义了__init__方法后,我们现在可以创建OurBool类型的实例:
var b = OurBool(
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。