当前位置: 首页 > 专利查询>南京大学专利>正文

一种基于向量处理器的在线编译方法技术

技术编号:2915510 阅读:232 留言:0更新日期:2012-04-11 18:40
本发明专利技术公开了一种基于向量处理器的在线编译方法,首先运用Python代码的map、filter、zip和range函数,将问题以list comprehension的表达方式定义为一组数据和一组处理函数;将Python代码编译成code对象,获取函数体的func_code属性,该属性为PyCode对象,通过dis库中的dis函数,对这个属性进行解析,将Python字节码翻译成对应的操作符;获取到操作符之后,对其进行扫描,分别处理if分支结构和循环结构两种过程。本发明专利技术只需要利用Python语言描述问题,即可自动的转换成可以在各种SIMD实现上运行的SIMD代码,大大降低SIMD的应用难度。

【技术实现步骤摘要】

:本专利技术涉及向量处理器技术,以及将Python代码自动编译成SIMD指令集的方法。
技术介绍
:随着多媒体技术的发展,对计算的需求越来越高,通用处理器的标量设计难以高效的完成计算任务。随着Intel的MMX,SSE等,AMD的3Dnow!扩展指令集的普及,以及基于GPU的CUDA,基于Cell处理器的SPE等技术的出现,针对向量处理器的编程变得越来越重要。SIMD(单指令多数据)式的向量处理器模式将在未来的应用中占用越来越重要的位置。然而,向量处理器在一个指令周期中处理多个数据的特点,决定了其程序开发方式与传统的标量处理器很不一样,例如,向量处理器难以用分支这种方式对数据进行不同的处理。向量处理器也需要合理的安排数据,使其充分向量化。随着向量处理器的发展,问题的并发规模也需要从几个到上千路并发的这么大尺度中变化。因为基于向量处理器的SIMD编程对编程人员的要求较高,随着硬件成本的降低和普及,支持SIMD的硬件已经随处可见,降低SIMD的开发门槛变成一个亟需解决的问题。基于该背景,本专利技术给出一种编程模型,使得程序员利用Python这样的高层脚本语言,即可写出能够以极快速度运行的SIMD代码。
技术实现思路
:本专利技术所要解决的技术问题是提供一种基于向量处理器将Python代码自动编译成SIMD指令集的方法。本专利技术所述的基于向量处理器的在线编译方法,其特征在于包括以下步骤:1)运用Python代码的map、filter、zip和range函数,将问题以list comprehension的表达方式定义为一组数据和一组处理函数;2)将Python代码编译成code对象,进行数据流分析,获取函数体的func_code属性,该属性为PyCode对象,通过dis库中的dis函数,对这个属性进行解析,将Python字节码翻译成对应的操作符;3)获取到操作符之后,对其进行扫描,分析以下两种过程:if分支结构以及循环结构:-->对于循环结构,将循环中对数列元素的单独操作,提炼成针对整个队列的操作,包括:通过map函数将一个操作映射到列表上的对应操作的向量模型;通过zip函数将若干个列表关联在一起进行操作的所对应的向量模型;再根据这些关系,产生相对应的SIMD指令,并给对应的SIMD实现编译,动态产生符合Python要求的动态链接库,由Python动态载入并执行;对于if分支结构,首先计算分支条件,然后计算左分支和右分支,最终根据分支条件的结果,将左右两个分支的结果合并。本专利技术让开发人员无需关心底层实现细节,专注于利用Python这样的高层语言描述问题,即可自动的转换成可以在各种SIMD实现上运行的SIMD代码,从而大大降低SIMD的应用难度。附图说明:图1本专利技术基本流程;图2-1map模型;图2-2zip模型;图3在Cell处理器上的SIMD支持示例;图4分支支持示例;图5多重分支示例。具体实施方式;图1为本专利技术的基本流程。通过将问题定义为一组数据和一组处理函数。通过运用python的map、filter、zip、range等函数,以及list comprehension的表达方式,将计算问题通过Python描述出来,具体解释如下:map表示将一个函数应用到一组数据中:map(lambda x:x+1,[1,2,3,4,5])->[2,3,4,5,6]filter表示将函数应用到一组数据中,并根据结果过滤数据:map(lambda x:x%2,[1,2,3,4,5])->[2,4]zip表示将若干组数据窜连在一起:-->zip([1,2,3,4],[5,6,7,8])->[(1,5),(2,6),(3,7),(4,8)]range表示生成一组等差数列:range(5)->[0,1,2,3,4]range(1,4)->[1,2,3]range(0,7,2)->[0,2,4,6]随后,通过将Python代码编译成code对象,进行数据流分析,将变量参与计算的过程,以及变量之间的关系提炼出来。其过程主要为:获取函数体的func_code属性。该属性为PyCode对象,通过dis库中的dis函数,可以对这个属性进行解析,将Python字节码翻译成对应的操作符。获取到操作符之后,对其进行一遍扫描,主要分析以下两种过程:if分支结构以及循环结构:对于循环结构,将循环中对数列元素的单独操作,提炼成针对整个队列的操作:图2-1描述了通过map将一个操作映射到列表上的操作对应的向量模型。图2-2描述了通过zip将若干个列表关联在一起进行操作的所对应的向量模型。根据这些关系,产生相对应的SIMD指令,并给对应的SIMD实现编译,动态产生符合Python要求的动态链接库,由Python动态载入并执行。图3给出在Cell处理器上的一种实现示例。对于if分支结构,由图4给出:首先计算分支条件,然后计算左分支和右分支,最终根据分支条件的结果,将左右两个分支的结果合并。当分支条件更为复杂时,则按照每个条件形成如图5所示的多重筛选器。随着分支条件的增多,采用SIMD的效率将大幅度下降。假设分支条件数量为n,一次SIMD同时处理m个数据,则采用SIMD和不采用SIMD的效率比为:根据这个公式,可以当前代码采用SIMD运算是否合适。-->本文档来自技高网...

【技术保护点】
一种基于向量处理器的在线编译方法,其特征在于包括以下步骤: 1)运用Python代码的map、filter、zip和range函数,将问题以list comprehension的表达方式定义为一组数据和一组处理函数; 2)将P ython代码编译成code对象,进行数据流分析,获取函数体的func_code属性,该属性为PyCode对象,通过dis库中的dis函数,对这个属性进行解析,将Python字节码翻译成对应的操作符; 3)获取到操作符之后,对其进行扫 描,分别处理以下两种过程:if分支结构以及循环结构: 对于循环结构,将循环中对数列元素的单独操作,提炼成针对整个队列的操作,包括:通过map函数将一个操作映射到列表上的对应操作的向量模型;通过zip函数将若干个列表关联在一起进行操作的 所对应的向量模型;再根据这些关系,产生相对应的SIMD指令,并给对应的SIMD实现编译,动态产生符合Python要求的动态链接库,由Python动态载入并执行; 对于if分支结构,首先计算分支条件,然后计算左分支和右分支,最终根据分支 条件的结果,将左右两个分支的结果合并。...

【技术特征摘要】
1、一种基于向量处理器的在线编译方法,其特征在于包括以下步骤:1)运用Python代码的map、filter、zip和range函数,将问题以list comprehension的表达方式定义为一组数据和一组处理函数;2)将Python代码编译成code对象,进行数据流分析,获取函数体的func_code属性,该属性为PyCode对象,通过dis库中的dis函数,对这个属性进行解析,将Python字节码翻译成对应的操作符;3)获取到操作符之后,对其进行扫描,分别处理以下两种过程:if分支结构以及循环结构:对于循环结构,将循环中对数列元素的单独操作,提炼成针对整个队列的操作,包括:通过map函数将一个操作映射到列表上的对应操作的向量模型;通过zip函数将若干个列表关联在一起进行操作的所对应的向量模型;再根据这些关系,产生相对应的SIMD指令,并给对应的SIMD实现编译,动态产生符合Python要求的动态链接库,由Python动态载入并执行;对于if分支结构,首先计算分支条件,然后...

【专利技术属性】
技术研发人员:吕琦李文中陆桑璐陈道蓄
申请(专利权)人:南京大学
类型:发明
国别省市:84[中国|南京]

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1