1.本技术涉及计算机技术领域,尤其涉及一种计算机程序的处理方法和电子设备。
背景技术:2.计算机程序(computer program)的特定功能是电子设备在运行该程序对应的代码时实现的。计算机程序实质上是由多个实现特定功能的函数构成的,每个函数对应一个代码段,函数是实现计算机程序功能的基本单元。
3.编写计算机程序的语言称为编程语言,例如c++、java等编程语言,是面向用户的,任何编程语言编写的计算机程序被电子设备运行时,会先被编译为电子设备支持的语言,之后经汇编成为机器语言,也即二进制代码,再被电子设备处理器执行。电子设备可支持的语言是运行该计算机程序的电子设备的处理器所支持的语言,又称为处理器所支持的指令集,指令集是用于实现特定功能的函数实现方式的集合。
4.通常,研发人员在发布某一计算机程序时,会同时发布该计算机程序对应的镜像文件,以便用户能更为便利地下载使用该计算机程序。但有些用户电子设备处理器支持的指令集可能与编写计算机程序的处理器支持的指令集不同。比如用于生成计算机程序的电子设备的处理器支持avx指令集,而用户电子设备的处理器只支持sse指令集。所以,当用户下载该镜像文件并运行时,可能出现运行错误。
5.为使上述计算机程序能在支持各种指令集的处理器上成功运行,研发人员需针对每种指令集发布单独的镜像文件,以使用户可根据需求下载对应的镜像文件。
技术实现要素:6.在实现上述方法的过程中,申请人发现针对每种指令集发布一个镜像文件,增加了研发人员的工作量,提高了研发成本,而且实际应用中,仍然存在因用户(尤其是非专业用户)不了解电子设备处理器支持的指令集,而下载错镜像文件,导致计算机程序无法成功运行的情况,影响用户体验。因此,为了解决这个问题,本技术提供了一种计算机程序的处理方法和电子设备。该方法可减轻研发人员的工作量,降低研发成本,同时该方法也可确保计算机程序能在支持任何指令集的电子设备处理器上运行成功,扩大了计算机程序的用户范围,提高了用户体验。
7.下面对本技术的技术方案展开介绍。
8.第一方面,本技术实施例提供了一种计算机程序的处理方法,应用于电子设备,电子设备包括处理器,该方法包括:初始化计算机程序,并获取处理器支持的第一指令集,其中,计算机程序包括第一函数,第一函数与第一函数接口对应,第一函数接口用于获取第一函数的多个不同指令集的实现方式中的任一实现方式;基于第一指令集,通过第一函数接口获取第一指令集的实现方式;执行第一指令集实现方式,以实现第一函数的功能。
9.在一些实现方式中,电子设备可以是笔记本电脑、台式电脑等设备,电子设备包括的处理器可以是一个或多个。
10.在一些实现方式中,初始化计算机程序指的是用户下载该计算机程序后,点击启动该计算机程序。
11.在一些实现方式中,处理器的第一指令集可以是avx指令集或sse指令集,本技术对此不作限制。但需要说明的是,指令集一般是向前兼容的,例如sse指令集发布时间要比avx指令集发布时间早,因此电子设备支持发布在后的avx指令集也必然会支持sse指令集。
12.在一些实现方式中,计算机程序包括但不限于下文提及的向量数据库程序。
13.可以理解,计算机程序本质上是由各个功能函数构成的,在一些实现方式中,本技术各实现方式中的计算机程序包括第一函数,第一函数包括但不限于向量内积计算函数、向量间欧式距离计算函数等。第一函数与第一函数接口对应,可通过第一函数接口获取第一函数的多个不同指令集的实现方式中的任一实现方式。因此,当获取电子设备处理器支持的第一指令集后,即可根据该第一指令集,利用第一函数接口获取第一函数的第一指令集的实现方式,然后执行该第一指令集的实现方式,即可实现第一函数的功能,更进一步地,可实现该计算机程序的功能。
14.如上所言,不同的处理器支持的指令集可能是不同的,比如用于生成计算机程序的电子设备的处理器支持avx指令集,而用户电子设备的处理器只支持sse指令集。所以,当用户下载该镜像文件并运行时,可能出现运行错误。而如果针对每种指令集发布一个镜像文件,增加了研发人员的工作量,提高了研发成本,而且实际应用中,仍然存在因用户(尤其是非专业用户)不了解电子设备处理器支持的指令集,而下载错镜像文件,导致计算机程序无法成功运行的情况,影响用户体验。
15.因此,通过上述第一方面的方法,在发布的计算机程序中设置上述第一函数接口,即可在当前电子设备初始化该计算机程序时,根据当前电子设备支持的第一指令集,利用该计算机程序中任何一个函数对应的函数接口获取该计算机程序中任何一个函数的第一指令集实现方式,然后执行该计算机程序在第一指令集的实现方式,进而实现该计算机程序的功能。而不再需要针对每一种指令集发布对应的计算机程序,降低了计算机程序的研发成本,提高了计算机程序的可适用范围,进而提供了用户体验。
16.结合第一方面,在第一方面的一种实现可能的实现方式中,计算机程序包括第一函数的多个不同指令集的实现方式,且第一函数的多个不同指令集的实现方式对应多个函数名,以及基于第一指令集,通过第一函数接口获取第一指令集的实现方式,包括:基于第一指令集以及第一函数,确定第一函数名,第一函数名是与第一指令集的实现方式对应的函数名;通过第一函数接口以及第一函数名,获取第一指令集的实现方式;利用第一指令集对应的第一编译参数,对第一函数的实现方式执行编译,以实现第一函数的功能。
17.在一些实现方式中,第一函数的多个不同指令集的实现方式对应多个函数名,也即第一函数的不同指令集的实现方式对应的函数名不同,并且不难理解,不同的函数名与其对应的指令集相关。因此,在获取电子设备支持的第一指令集后,可根据第一指令集确定第一函数的第一指令集的实现方式对应的函数名(即第一函数名),然后利用第一函数接口以及该第一函数名,即可获取第一函数的第一指令集的实现方式。
18.在一些实现方式中,如果计算机程序是已经编译后的可执行文件,例如是计算机程序对应的镜像文件,那么获取第一函数的第一指令集的实现方式后,执行该实现方式即可;如果计算机程序是没有经过编译的程序,那么可以理解,还需要利用与第一指令集对应
的第一编译参数,对第一函数的第一指令集的实现方式(也即第一函数的实现方式)执行编译,以实现第一函数的功能。
19.可以理解,通过函数接口以及函数名的方式获取函数的不同指令集实现方式,可以提高计算机程序的初始化效率,提高用户体验。
20.结合第一方面以及上述可能的实现方式,在一种可能的实现方式中,初始化计算机程序,并获取处理器支持的第一指令集,包括:获取第一预设指令,第一预设指令是从计算机程序获取的;确定与第一预设指令对应的返回值;根据返回值确定处理器支持的第一指令集,其中,返回值表示处理器是否支持与第一预设指令对应的指令集。
21.也即在一些实现方式中,可以在计算机程序中内置用于获取运行该计算机程序的电子设备处理器信息的指令(也即第一预设指令),其中,电子设备处理器信息包括电子设备支持的指令集信息。那么当该计算机程序被初始化时,通过第一预设指令即可获取当前电子设备支持的指令集。
22.更具体地,在一些实现方式中,可以根据与第一预设指令对应的返回值,确定电子设备支持的第一指令集。例如,当返回值类型为布尔型数据时,如果返回值为第一值(比如“1”)时,确定电子设备支持第一预设指令对应的指令集,当返回值为第二值(比如“0”时),确定电子设备不支持第一预设指令对应的指令集。例如,假设第一预设指令为bool cpu_support_avx()(表示确定电子设备是否支持avx指令集)和bool cpu_support_sse()(表示确定电子设备是否支持sse指令集),如果bool cpu_support_avx()的返回值为“1”,表明电子设备支持avx指令集,而且由于指令集向前兼容,因此电子设备也支持sse指令集,也即此时cpu_support_sse()的返回值也为“1”;如果bool cpu_support_avx()的返回值为“0”,bool cpu_support_sse()的返回值为“1”,表明电子设备不支持avx指令集,而支持sse指令集,如果如果bool cpu_support_avx()的返回值为“0”,bool cpu_support_sse()的返回值为“0”,标识电子设备不支持avx指令集也不支持sse指令集,此时为了保证计算机程序初始化正常,将采用默认的实现方式实现该计算程序中各函数的功能。
23.结合第一方面以及上述可能的实现方式,在一种可能的实现方式中,返回值的类型包括布尔型数据,根据返回值确定处理器支持的第一指令集,包括:若返回值为第一值,处理器支持与第一预设指令对应的指令集;若返回值为不同于第一值的第二值,处理器不支持与第一预设指令对应的指令集。
24.结合第一方面以及上述可能的实现方式,在一种可能的实现方式中,函数接口包括函数指针,函数指针根据返回值与第一预设条件的关系确定,若返回值中存在第一值,函数指针指向与第一预设指令相关的指令集的第一函数的实现方式;若返回值均为第二值,函数指针指向预设函数实现方式。
25.也即在一些实现方式中,函数接口的形式可以是函数指针。可以理解,函数指针实质上是一个变量,当为该函数指针赋值后,该函数指针将指向该变量对应的函数。例如,如果函数指针的值为某一个函数名,那么对于该函数指针的调用等同于对该函数的调用。
26.可以理解,函数指针一般是动态的,因此在计算机程序中以函数指针的形式实现该函数接口,可使该函数接口根据当前电子设备支持的指令集,指向不同的函数实现方式。
27.在一些实现方式中,函数指针的指向(或值)可以根据第一预设指令的返回值与第一预设条件之间的关系确定。其中,关于第一预设条件与返回值之间的关系将在下文具体
阐述,此处不作介绍。
28.结合第一方面以及上述可能的实现方式,在一种可能的实现方式中,初始化计算机程序,并获取处理器支持的第一指令集,包括:获取用户指令以及第一预设指令,第一预设指令是从计算机程序获取的;获取响应于第一预设指令输出的指示处理器支持的第一指令集的数据,以获取处理器支持的第一指令集,在用户指令表征的处理器支持的指令集与第一预设指令确定的处理器支持的第一指令集一致的情况下,以用户指令表征的处理器支持的指令集作为第一指令集;在用户指令表征的处理器支持的指令集与第一预设指令确定的处理器支持的第一指令集不一致的情况下,以第一预设指令确定的指令集作为第一指令集。
29.可以理解,有些用户可能是了解电子设备处理器支持的指令集的,因此在一些实现方式中,本技术计算机程序处理方法还可以提供一种人机交互的方式,使用户根据需求选择电子设备处理器支持的指令集,以提高用户体验。
30.为了避免用户指令出现错误,影响电子设备初始化计算机程序,在一些实现方式中,本技术计算机程序处理方法结合用户指令以及上述第一预设指令共同确定电子设备支持的第一指令集。具体确定方式将在下文介绍。
31.结合第一方面以及上述可能的实现方式,在一种可能的实现方式中,获取响应于第一预设指令输出的指示处理器支持的第一指令集的数据,以获取处理器支持的第一指令集,包括:根据第一预设指令对应的返回值确定处理器支持的第一指令集,返回值表示处理器是否支持与第一预设指令对应的指令集,返回值的类型包括布尔型数据,若返回值为第一值,处理器支持与第一预设指令对应的指令集;若返回值为不同于第一值的第二值,处理器不支持与第一预设指令对应的指令集。
32.结合第一方面以及上述可能的实现方式,在一种可能的实现方式中,函数接口包括函数指针,函数指针指向用户指令对应的变量值与返回值做与运算后,结果为第一值时对应的指令集中的第一函数的实现方式。
33.也即在一些实现方式中,通过将用户指令对应的变量值与第一预设指令对应的返回值做与运算,在二者做与运算的结果为第一值(例如“1”)时,也即根据用户指令确定的电子设备处理器支持的指令集与根据第一预设指令确定的电子设备支持的处理器指令集一致时,函数指针指向该指令集中的实现方式。
34.结合第一方面以及上述可能的实现方式,在一种可能的实现方式中,方法还包括:在初始化计算机程序的过程中,显示第一用户界面,第一用户界面用于提示用户输入用户指令。这样可视化的人机交互方式,能够提高用户的交互体验。第二方面,本技术实施例提供了一种计算机程序的处理装置,装置用于运行计算机程序,其特征在于,包括:
35.第一模块,第一模块用于初始化计算机程序,并获取处理器支持的第一指令集,其中,计算机程序包括第一函数,第一函数与第一函数接口对应,第一函数接口用于获取第一函数的多个不同指令集的实现方式中的任一实现方式;
36.第二模块,第二模块用于基于第一指令集,通过第一函数接口获取第一函数的第一指令集的实现方式;
37.第三模块,第三模块用于执行第一函数的实现方式,以实现第一函数的功能。
38.结合第二方面,在第二方面的一种可能的实现方式中,计算机程序包括第一函数
的多个不同指令集的实现方式,且第一函数的多个不同指令集的实现方式对应多个函数名,以及第二模块还用于:
39.基于第一指令集,通过第一函数接口获取第一指令集的实现方式,包括:
40.基于第一指令集以及第一函数,确定第一函数名,第一函数名是与第一指令集的实现方式对应的函数名;
41.通过函数接口以及第一函数名,获取第一指令集的实现方式;以及第三模块用于利用第一指令集函数分组对应的第一编译参数,对第一函数的实现方式执行编译,以实现第一函数的功能。
42.结合第二方面以及上述可能的实现方式,在一种可能的实现方式中,第一模块还用于:
43.获取第一预设指令,第一预设指令是从计算机程序获取的;
44.确定与第一预设指令对应的返回值;
45.根据返回值确定处理器支持的第一指令集,其中,返回值表示处理器是否支持与第一预设指令对应的指令集。
46.结合第二方面以及上述可能的实现方式,在一种可能的实现方式中,返回值的类型包括布尔型数据,根据返回值确定处理器支持的第一指令集,第一模块还用于:
47.若返回值为第一值,处理器支持与第一预设指令对应的指令集;
48.若返回值为不同于第一值的第二值,处理器不支持与第一预设指令对应的指令集。
49.结合第二方面以及上述可能的实现方式,在一种可能的实现方式中,函数接口包括函数指针,函数指针根据返回值与第一预设条件的关系确定,若返回值中存在第一值,函数指针指向与第一预设指令相关的指令集的实现方式;
50.若返回值均为第二值,函数指针指向预设函数实现方式。
51.结合第二方面以及上述可能的实现方式,在一种可能的实现方式中,第一模块继续用于:
52.获取用户指令以及第一预设指令,第一预设指令是从计算机程序获取的;
53.获取响应于第一预设指令输出的指示处理器支持的第一指令集的数据,以获取处理器支持的第一指令集,在用户指令表征的处理器支持的指令集与第一预设指令确定的处理器支持的第一指令集一致的情况下,以用户指令表征的处理器支持的指令集作为第一指令集;
54.在用户指令表征的处理器支持的指令集与第一预设指令确定的处理器支持的第一指令集不一致的情况下,以第一预设指令确定的指令集作为第一指令集。
55.结合第二方面以及上述可能的实现方式,在一种可能的实现方式中,第一模块用于:
56.根据第一预设指令对应的返回值确定处理器支持的第一指令集,返回值表示处理器是否支持与第一预设指令对应的指令集,返回值的类型包括布尔型数据,若返回值为第一值,处理器支持与第一预设指令对应的指令集;
57.若返回值为不同于第一值的第二值,处理器不支持与第一预设指令对应的指令集。
58.结合第二方面以及上述可能的实现方式,在一种可能的实现方式中,函数接口包括函数指针,函数指针指向用户指令对应的变量值与返回值做与运算后,结果为第一值时对应的指令集中的实现方式。
59.结合第二方面以及上述可能的实现方式,在一种可能的实现方式中,第一模块还用于:
60.在初始化计算机程序的过程中,显示第一用户界面,第一用户界面用于提示用户输入用户指令。
61.第三方面,本技术实施例还提供了一种电子设备,该电子设备包括存储器,存储有计算机程序指令;处理器,处理器和存储器耦合,当存储器存储的计算机程序指令被处理器执行时使得电子设备实现上述第一方面中任一项的方法。
62.第四方面,本技术实施例提供了一种计算机可读介质,计算机可读介质存储有计算机程序,其特征在于,计算机程序被处理器执行时实现上述第一方面中任一项的方法。
63.第五方面,本技术实施例提供了一种计算机程序产品,当计算机程序产品在电子设备上运行时,使得电子设备执行上述第一方面中任一项的方法。
64.可以理解的是,上述第二方面至第四方面的有益效果可以参见上述第一方面中的相关描述,在此不再赘述。
附图说明
65.为了更清楚地说明本技术实施例中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本技术的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
66.图1是根据本技术实施例提供的适用本技术方法的一例场景示意图;
67.图2是根据本技术实施例提供的适用本技术方法的又一例场景示意图;
68.图3是根据本技术实施例提供的在电子设备上实现本技术方法的示意图;
69.图4是根据本技术实施例提供的另一例方法流程示意图;
70.图5是根据本技术实施例提供的又一例方法流程示意图;
71.图6a是根据本技术实施例提供的一例人机交互界面示意图;
72.图6b是根据本技术实施例提供的另一例人机交互界面示意图;
73.图7是根据本技术实施例提供的一例实现本技术方法的计算机程序运行装置700的框图;
74.图8是根据本技术实施例提供的一例实现本技术方法的系统800的框图。
具体实施方式
75.下面将使用本领域技术人员通常采用的术语来描述说明性实施例的各个方面。应当理解,此处描述的具体实施例仅仅用以解释本技术,并不用于限定本技术。也应理解,本技术技术方案中涉及的对数据的获取、存储、使用、处理等均符合国家法律法规的相关规定。
76.如前所述,用户如果想要运行某个计算机程序,必须首先明确用户端硬件平台上
的处理器所支持的指令集,再用对应的编译参数对源代码编译,才能得到能在用户端的硬件环境上成功运行该计算机程序。随着技术的发展,很多计算机程序在发布各版本源代码的同时,为便于用户下载后直接运行,研发人员会同时发布该计算机程序对应的镜像文件,并且为使该镜像文件能运行在支持不同指令集的处理器上,还会针对每种指令集发布一个镜像文件,以使用户根据需求下载对应的镜像文件。若计算机程序采用上面这种方式通过编译参数来选择指令集,那么就不得不针对每种指令集发布多个镜像。而用户也必须选择正确的镜像才能在自己的硬件环境上正常运行。如果用户选择了错误的镜像,比如自己的硬件平台的处理器(例如中央处理器(central process unit,cpu))只能支持sse指令集,但用户却选择了由avx指令集编译出来的镜像,那么计算机程序在运行时会抛出错误“runtime error:illegal instruction”,因此对用户来说十分复杂繁琐,体验效果差,工作效率低下。
77.其中,镜像文件可理解为计算机程序源代码的副本,镜像文件与计算机程序源代码的不同之处在于,用户如直接下载计算机程序源代码,还需要配置编译环境及进行代码编译,对普通用户不友好。而下载镜像文件则不同,镜像文件在用户下载后,便可直接运行使用。在一些实现方式中,镜像文件可以是docker镜像。镜像文件与计算机程序版本对应,不同版本计算机程序对应不同的镜像文件。本技术对镜像文件的形式不作限制。
78.本技术中的实施例以向量数据库作为计算机程序的一个示例。可以理解,本技术中提及的向量数据库程序包括向量数据库对应的源代码或者向量数据库对应的源代码经过编译后得到的可执行文件,例如上文提及的镜像文件。
79.向量数据库是用来存储、检索、分析向量的数据库。向量是表示图像数据、音视频数据、文本数据等数据的特征,某两个数据的特征之间的相似度满足一定条件,则认为这两个数据具有相似性。向量数据库广泛应用于数据检索、图像检索、图像识别、语音识别等领域,用户可通过使用向量数据库,实现高效地数据检索和数据分析。而在对向量构建索引(index)及对索引进行查询时,需要频繁地计算向量间的距离。由于向量的维度高,计算向量间的距离属于典型的计算密集型任务,需要耗费大量的cpu时间。各cpu制造商很早就研发了扩展指令集以提升cpu的运算能力。如intel公司在1999年开发了sse指令集,可同时处理4个32位浮点数;在2010/2011年分别开发了avx和avx2指令集,可同时处理8个32位浮点数;2016年又开发了avx512指令集,可同时处理16个32位浮点数。其他cpu制造商如amd和apple公司也有自己的cpu指令集。要编译不同指令集编写的源代码文件,需要指定不同的编译参数。以gcc编译器为例,若要编译用sse4.2指令集编写的源代码文件,需要指定编译参数
″‑
msse4.2
″
;若要编译用avx2指令集编写的源代码文件,需要指定编译参数
″‑
mavx2
″
。
80.本技术中的技术方案实现了只用一个docker镜像文件便可支持多种指令集,并且使得该向量数据库在运行时能够动态选择指令集。
81.如图1所示,研发人员通过电子设备1发布某版本向量数据库,以及用不同指令集编译的该版本向量数据库的镜像文件,镜像1-sse、镜像2-sse.4.2、镜像3-avx2
…
镜像n-avx512。用户根据自身需求,下载与其电子设备处理器支持的指令集对应的镜像文件。比如用户电子设备2处理器支持的指令集为sse,用户可选择下载镜像1-sse,如果用户电子设备3处理器支持的指令集为avx2,用户可选择下载镜像3-avx2,如果用户电子设备4处理器支持的指令集为avx512,用户可选择下载镜像n-avx512。下载对应的镜像文件后,由于用户电
子设备处理器支持该镜像文件的对应的指令集,所以用户电子设备可以正常运行该镜像文件,进而实现该镜像文件中与指令集相应的各函数的功能,继而实现该向量数据库的功能。例如,如果向量数据库支持图像查找、数据检索等功能,那么电子设备在运行该镜像文件时,可实现该镜像文件中与向量相似度对比相关的函数的功能,例如电子设备运行该镜像文件时,实现向量间欧式距离、余弦距离、汉明距离、向量间内积等相关的函数的功能。
82.以向量数据库中常用的计算向量间内积的函数fvec_inner_product()为例,对于镜像文件3-avx2而言,电子设备4通过avx2指令集实现fvec_inner_product()的功能。对于镜像1-sse而言,电子设备2则通过sse指令集实现fvec_inner_product()的功能。
83.上述方式虽在一定程度上可保证用户能下载到其电子设备处理器支持的指令集对应的镜像文件,但一方面对于研发人员而言,需针对不同的指令集发布不同的镜像文件,在此过程中,研发人员需利用不同的指令集编译参数重新编译计算机程序源代码后再发布,增加研发人员的工作量,提高了研发成本;另一方面,对于用户而言,尤其是非专业用户,往往缺乏对其电子设备所支持的指令集的了解,所以即使研发人员发布了分别支持不同指令集的多个镜像文件,仍然存在用户下载错镜像文件,导致无法成功运行镜像文件的可能,影响用户体验。
84.需理解,上述电子设备1至电子设备4支持的指令集包括但不限于sse、sse4.2、avx、avx512等指令集,而上述电子设备1至电子设备4可以是服务器、智能手机、平板电脑、笔记本电脑、台式计算机等电子设备,本技术对此不作限制。
85.还需理解,上述电子设备可以包括一个处理器,例如电子设备仅有中央处理器(central processing unit,cpu),也可以包括多个处理器,例如电子设备包括中央处理器和图像处理器(graphics processing unit,gpu)。其中处理器还可以是协处理器(coprocessor)、神经网络处理器(neural-network processing,npu)、应用处理器(application processor,ap)等等,本技术对此不作限制。
86.因此,为降低研发成本,提高用户体验,本技术提供了一种计算机程序的处理方法及电子设备。在本技术的计算机程序的处理方法中,通过定义能访问不同函数的不同指令集的实现方式的函数接口,使电子设备在初始化该计算机程序过程中,自动根据其可支持的第一指令集,通过该函数接口,获取计算机程序的各函数的第一指令集实现方式,然后执行计算机程序的各函数的第一指令集实现方式,实现该计算机程序对应的功能。
87.在一些实现方式中,上述各函数的第一指令集实现方式可以是已经编译好的可执行文件,也可以是仍需要利用第一指令集对应的编译参数参与编译的文件,本技术对此不作限制。
88.下面结合本技术各实施例的附图介绍本技术的实现过程。
89.图2示出了本技术方法的一种使用场景示意图。如图2所示,通过本技术的方法,研发人员仅需发布某版本的计算机程序以及与该计算机程序对应的一份镜像文件,由于该计算机程序中有能访问函数的不同指令集实现方式的函数接口,用户下载并使用镜像文件时,用户电子设备可根据自身支持的第一指令集,通过该函数接口获取函数的第一指令集实现方式,实现该计算机程序的对应功能。
90.例如,以计算向量间内积的函数fvec_inner_product()、函数接口为函数指针为例,假设定义的镜像文件中可访问函数的不同指令集实现方式的函数指针为fvec_inner_
product。不同电子设备处理器下载该镜像文件后,均可通过fvec_inner_product访问当前电子设备支持的该函数的指令集的实现方式,然后执行该指令集的实现方式,以运行该镜像文件。具体地,如图3所示,如果电子设备3支持的第一指令集为avx,电子设备3可根据avx指令集,以及函数指针fvec_inner_product,访问函数fvec_inner_product()的avx指令集函数实现方式,然后执行对该函数实现方式,实现该函数的功能(计算向量间内积),进而实现该计算机程序的特定功能(例如数据检索功能)。对于其他支持不同指令集的电子设备而言,在运行该镜像文件时,可通过同样的方式实现计算机程序的功能。
91.上述计算向量间内积的函数fvec_inner_product()仅作为指令集中的一个函数示例,可以理解,指令集还可以包括其他函数(例如向量间欧式距离函数),本技术对此不作限制。
92.为更进一步理解本技术方法的实现过程,下面结合附图4至图7介绍本技术计算机程序的处理方法的具体细节。需要说明的是,以下各方法的实施主体均为电子设备的处理器,下文不再赘述。
93.在此之前,首先介绍定义本技术计算机程序的处理方法中函数接口的基础,即如何构建计算机程序包括的各函数的不同指令集的实现方式的集合。该过程可包括两个步骤:(1)获取多个函数的不同指令集实现方式;(2)为不同函数的不同指令集实现方式设置不同的函数分组,每个函数分组具有分组标识以及与指令集对应的编译参数。在本技术的实现方式中,该过程一般是由图1所示的电子设备1的处理器实现的,但应理解,在其他实现方式中,该过程也可由运行上述镜像文件的电子设备2至电子设备n中任意电子设备处理器实现,本技术对此不作限制。下文以执行主体为电子设备1的处理器为例进行说明。
94.对于(1)获取多个函数的不同指令集实现方式:
95.可以理解,若需本技术实现方式中的函数接口能按需获取不同指令集中的函数实现方式,电子设备1处理器需获取多个函数的不同指令集实现方式,以便电子设备1处理器运行包含该函数的计算机程序时,能通过函数接口,获取与电子设备1处理器支持的指令集对应的函数实现方式,以实现该函数的功能。
96.例如,继续以上文计算向量间内积的函数fvec_inner_product()为例,电子设备1处理器需要获取fvec_inner_product()在不同的指令集的实现方式。示例性地,电子设备1处理器获取fvec_inner_product()的avx指令集实现方式、以及sse指令集实现方式。
97.在一些实现方式中,为了确保电子设备1能够实现某一函数的功能,因此可在确定的指令集之外,以默认指令集(或预设指令集)的方式预设某一函数的通用实现方式,当电子设备1处理器获取可支持的指令集失败时,可通过从默认指令集中获取该函数实现方式,确保计算机程序的成功运行。示例性地,默认指令集(为便于说明以“ref”表示)中fvec_inner_product()的通用实现方式。在另一些实现方式中,当电子设备1处理器获取可支持的指令集没有某函数对应的实现方式时,例如电子设备1处理器指令集版本较老,而镜像文件中尚未更新对应的函数实现方式,电子设备1处理器也可以镜像文件中默认指令集中对应的函数实现方式,实现计算机程序的运行。
98.对于(2)为使用不同指令集的不同函数实现方式设置不同的函数分组,每个函数分组具有分组标识以及与该函数指令集对应的编译参数:
99.也即基于上述函数的多个不同指令集的函数实现方式,电子设备1处理器为函数
的不同指令集函数实现方式,设置不同的函数分组,并为每个函数分组设置唯一的分组标识,该分组标识是为了便于后续根据函数接口按照该分组标识对应的函数分组,获取该函数分组中的函数实现方式,并执行这些函数的实现方式,以实现函数的功能。
100.也即,电子设备1处理器实质上是建立函数的不同指令集实现方式、不同指令集之间的映射关系,以便在运行包括某函数的计算机程序时,电子设备1处理器能够根据所支持的指令集,以及函数接口,获取与所支持的指令集对应的函数实现方式,执行该函数的实现方式实现该函数的功能。
101.在一些实现方式中,还可以同时获取与上述指令集对应的编译参数,以针对各函数的函数实现方式执行编译,进而实现上述函数的功能。本技术对此不作限制。
102.具体地,在一些实现方式中,电子设备1处理器按照函数的不同指令集实现方式对函数进行分组,得到与指令集对应的不同的函数分组。也即,每个函数分组包括多个函数的同一指令集实现方式。例如,函数分组distance_simd_avx.cpp下包括多个函数的avx指令集实现方式,比如fvec_inner_product()的avx指令集实现方式、fvec_l2sqr()的avx指令集实现方式。然后每个函数分组中的各函数的函数名,可进一步根据该函数分组的分组标识(例如avx、sse等)以及该函数的功能确定。例如,fvec_inner_product()功能为计算向量间内积,那么其在指令集avx的实现方式对应的函数名,可以根据fvec_inner_product以及avx确定,即该函数的avx指令集实现方式对应的函数名可以为fvec_inner_product_avx()。又例如,fvec_l2sqr()的功能为计算向量间欧式距离,那么其在指令集avx的实现方式对应的函数名,可以根据fvec_l2sqr以及avx确定,即该函数的avx指令集实现方式对应的函数名可以为fvec_l2sqr_avx()。更具体地以默认指令集(或预设指令集)、sse指令集以及avx指令集为例,电子设备1处理器可将函数fvec_inner_product()的实现方式按照指令集分为3个函数分组,并以指令集为每个函数分组设置分组标识。示例性地,fvec_inner_product()的3个函数分组、指令集、分组标识以及编译参数之间的对应关系可如下表1所示:
103.表1
[0104][0105]
在一些实现方式中,一个指令集可以对应多个函数分组,每个函数分组包括的函数的功能不同。例如,对于上表1中的avx指令集,可对应向量间内积计算函数分组以外的其他函数分组。本技术对此不作限制。
[0106]
可以理解,对于某函数的默认指令集实现方式,一般是在该函数没有当前电子设备支持的指令集实现方式下才被使用的,在使用函数的默认指令集实现方式时,电子设备的运行效率相较使用合适的函数指令集实现方式时,会明显下降,例如运行耗时变长等等。
[0107]
经过上述过程,即可得到包括对应不同指令集的不同函数的函数分组,以便后续
运行计算机程序的不同处理器根据其可支持的指令集,通过上述函数接口,获取计算机程序中各函数的当前电子设备可支持的指令集的实现方式,然后执行这些实现方式,实现计算机程序的功能。
[0108]
下面本技术计算机程序处理方法的实现细节。图4根据本技术实施例示出了实现计算机程序处理方法的流程示意图。如图4所示,该方法包括:
[0109]
401,初始化计算机程序,并获取处理器支持的第一指令集。
[0110]
在一些实现方式中,计算机程序包括第一函数,第一函数与第一函数接口对应,第一函数接口用于获取第一函数的多个不同指令集的实现方式中的任一实现方式。其中,第一函数包括但不限于上述向量间内积计算函数fvec_inner_product()。第一函数接口是由研发人员预先定义的用于获取第一函数在多个不同指令集的实现方式中任一实现方式的通用接口。
[0111]
在一些实现方式中,第一函数接口可以为函数指针,可以理解,该函数指针为动态指针,可以根据获取的电子设备支持的第一指令集,指向与某函数的第一指令集的实现方式。可以理解,本技术的实现方式中,每个函数都对应有用于获取该函数的不同指令集实现方式的函数接口,例如向量间内积计算函数fvec_inner_product()对应有fvec_inner_product函数接口,向量内积计算函数对应有内积计算相关的函数接口,本技术对此不作限制。
[0112]
在一些实现方式中,计算机程序包括计算机程序对应的源代码,或者计算机程序对应的源代码经过编译后的镜像文件,本技术对此不作限制。
[0113]
在一些实现方式中,用户下载计算机程序至电子设备后,电子设备会对该计算机程序做初始化,电子设备处理器可以根据第一预设指令,获取电子设备处理器支持的第一指令集。其中,该第一预设指令为电子设备处理器信息的获取指令,它被包括在上述计算机程序中。
[0114]
具体地,电子设备处理器根据第一预设指令,返回与第一预设指令相关的返回值,其中,第一预设指令与指令集对应,而返回值表示电子设备处理器是否支持与第一预设指令对应的指令集。在一些实现方式中,返回值的类型可以为布尔型数据。例如,当电子设备处理器支持与第一预设指令对应的指令集时,电子设备处理器返回的返回值为“1”(第一值或第二值),当电子设备处理器不支持与第一预设指令对应的指令集时,电子设备处理器返回的返回值为“0”(第二值或第一值)。示例性地,以获取电子设备是否支持avx或sse指令集为例,第一预设指令可以如下表2所示:
[0115]
表2
[0116]
第一预设指令功能bool cpu_support_avx()获取电子设备处理器是否支持avx指令集bool cpu_support_sse()获取电子设备处理器是否支持sse指令集
[0117]
其中,“bool”指的是第一预设指令对应的返回值类型为布尔型数据,即“非真即假”。也即,对于第一预设指令为bool cpu_support_avx(),如果电子设备处理器不支持avx指令集,则bool cpu_support_avx()返回值为“假(false)”,如果电子设备处理器支持avx指令集,则bool cpu_support_avx()返回值为“真(true)”。对于第一预设指令为bool cpu_support_sse(),如果电子设备处理器不支持sse,则bool cpu_support_sse()返回值
为“假(false)”,如果电子设备处理器支持avx,则bool cpu_support_sse()返回值为“真(true)”。
[0118]
可以理解,在一些实施例中,第一预设指令对应的返回值类型也可以为其他数据类型,例如整型(int)、字符型(string)、短字符型(short)等等,相应地,研发人员可根据返回值的类型,定义返回值表示的含义,例如如果返回值类型为int型,研发人员可定义当返回值为“0”时,表示电子设备处理器不支持某指令集,当返回值为“1”时,表示电子设备处理器支持某指令集,本技术对此不作限制。
[0119]
在一些实现方式中,如果是获取电子设备是否支持其他指令集,则上述第一预设指令可以发生相应改变,本技术对此也不作限制。
[0120]
402,基于第一指令集,通过第一函数接口获取第一函数的第一指令集的实现方式。
[0121]
可以理解,由于第一函数接口与第一函数的不同指令集实现方式对应,所以在确定第一指令集后,可以根据第一指令集确定该函数的第一指令集实现方式对应的函数名,然后根据第一函数接口以及该函数名,获取第一函数的第一指令集实现方式。
[0122]
例如,假设第一指令集为sse,第一函数接口为fvec_inner_product,第一函数为fvec_inner_product(),那么可以根据fvec_inner_product以及sse,可以确定该函数的函数名fvec_inner_product_sse,然后根据该函数的函数名,获取fvec_inner_product()的sse实现方式,即fvec_inner_product_sse()。
[0123]
在一些实现方式中,可通过判断上述第一预设指令的返回值与第一预设条件的关系,确定函数接口指向的函数名,或者说该函数接口的取值。其中,作为一种示例,函数接口的形式可以是函数指针。示例性地,上表2中两个第一预设指令的返回值与第一预设条件以及函数指针(为便于理解,函数指针以字符串fvec_inner_product表示)之间的对应关系可如下表3所示:
[0124]
表3
[0125][0126]
也即,根据第一预设指令,获取到电子设备处理器支持avx指令集时,即boolcpu_support_avx()的返回值为true时,由于指令集一般是向前兼容的,而sse指令集发布时间要比avx指令集发布时间早,因此电子设备支持avx指令集也必然会支持sse指令集,也即bool cpu_support_sse()返回值也为true,函数指针fvec_inner_product的取值为fvec_inner_product_avx,或者说函数指针指向函数名为fvec_inner_product_avx的函数实现方式fvec_inner_product_avx()。
[0127]
根据第一预设指令,获取到电子设备处理器支持sse指令集时,即bool cpu_
support_sse()的返回值为true,同理,bool cpu_support_avx()的返回值应为false,函数指针fvec_inner_product的取值为fvec_inner_product_sse,或者说函数指针指向函数名为fvec_inner_product_sse的函数实现方式fvec_inner_product_sse()。
[0128]
同样地,如上文所言,为确保计算机程序在电子设备处理器上的成功运行,当电子设备的处理器支持的指令集不在上表1至表2所示的指令集中,也即第一预设指令bool cpu_support_avx()和bool cpu_support_sse()的返回值均为false时,函数指针fvec_inner_product的取值为fvec_inner_product_ref,即指向默认指令集中该函数的实现方式。
[0129]
在另一些实现方式中,电子设备处理器也可以根据函数接口以及各函数分组标识,获取与该函数分组标识对应的第一函数分组,然后再从第一函数分组中,根据该函数的功能,获取各函数的实现方式。在一些实现方式中,函数分组标识的可以是该函数分组对应的名称、编号等等,而函数分组对应的名称、编号等可以是数字、字母等形式,本技术对此不作限制。
[0130]
例如,若根据402确定的函数指针fvec_inner_product的取值为fvec_inner_product_avx,则可根据函数指针以及上表3中的函数分组标识avx,然后从distance_simd_avx对应的函数分组distance_simd_avx.cpp中,根据该函数的功能(计算向量间内积(inner_product)),获取该函数的avx实现方式fvec_inner_product_avx()。
[0131]
再例如,继续以第一函数是fvec_inner_product()为例,假设根据上述401402确定的函数指针fvec_inner_product的取值为fvec_inner_product_sse,则根据该函数指针以及上表3中的函数分组标识sse,然后从distance_simd_sse对应的函数分组distance_simd_sse.cpp中,根据该函数的功能(计算向量间内积(inner_product)),获取该函数的sse指令集函数实现方式fvec_inner_product_sse()。
[0132]
403,执行第一函数的第一指令集实现方式,以实现第一函数的功能。
[0133]
可以理解,在获取第一函数的第一指令集实现方式后,即可该实现方式,以实现第一函数的功能。例如,假设获取了fvec_inner_product的sse指令集实现方式fvec_inner_product_sse(),那么执行sse指令集的实现方式,即可实现该函数的功能(即向量间内积的计算)。
[0134]
或者,在另一些实现方式中,当上述第一函数的第一指令集的实现方式是未经过编译的,那么也可以借助与第一指令集对应的第一编译参数。对该第一函数的第一指令集实现方式执行编译,实现该函数的功能。例如,假设第一函数的第一指令集实现方式则可以利用相对应的第一编译参数,对该实现方式执行编译,实现该函数的功能,本技术对此不作限制。
[0135]
可以理解,对于计算机程序中每一个功能函数,都进行401至403所的操作,即可实现该计算机程序的功能,例如如果计算机程序是向量数据库,那么即可实现向量数据库程序的数据搜索功能。
[0136]
通过上述方法可减轻研发人员的工作量,降低研发成本,同时该方法也可确保计算机程序能在支持不同指令集的不同电子设备处理器上成功运行,扩大了计算机程序对应的用户范围,提高了用户体验。
[0137]
如有需要,在本技术的一些实现方式中,还可在运行上述计算机程序时,由用户根
据实际情况通过相应的设置,协助确定上述函数接口。图5根据本技术实施例示出了另一种计算机程序处理方法的流程示意图,其与图4所示的计算机程序处理流程相同或相似的地方可参考上文相关描述,以下不再赘述。具体地,该方法包括:
[0138]
501,初始化计算机程序,接收用户指令,根据用户指令获取电子设备处理器支持的第一指令集。
[0139]
在一些实现方式中,电子设备在初始化计算机程序的过程中,可显示相应的提示信息,提示用户“请选择系统支持指令集”,由用户可根据实际情况,输入用户指令,以选择处理器支持的指令集。例如,如图6a至图6b所示,用户通过电子设备3下载镜像文件后,点击运行镜像文件,在运行过程中,电子设备3的显示屏上显示第一用户界面,该第一用户界面上显示有“请选择系统支持指令集”的提示信息。用户如果知道电子设备3支持的指令集(avx/sse),则可选择对应的指令集模式,例如用户可选择avx模式或sse模式,用户如果不知道电子设备3支持的指令集或者希望由电子设备3自动选择可支持的指令集,则可选择auto模式。
[0140]
在另一些实现方式中,为避免用户指令有误,因此可通过用户指令以及第一预设指令共同确定电子设备处理器支持的指令集。具体地,在用户指令表征的处理器支持的指令集与第一预设指令返回值表示的处理器支持的指令集一致的情况下,以用户指令为准,即以用户指令表征的处理器支持的指令集为第一指令集。在用户指令表征的处理器支持的指令集与根据第一预设指令返回值表示的处理器支持的指令集不一致的情况下,以第一预设指令返回值表示的处理器支持的指令集为第一指令集。
[0141]
502,基于第一指令集,通过第一函数接口获取第一函数的第一指令集的实现方式。
[0142]
对于仅根据用户指令确定的第一指令集的方式,研发人员可设置变量值表示用户指令对应的指令集,然后利用该变量值确定函数接口。其中,变量值的类型包括布尔型数据。例如如果用户指令表征处理器支持的指令集为sse指令集,则该sse指令集对应的变量值为“1”,而其他指令集对应的变量值为“0”,此时可利用sse指令集对应的分组标识为函数接口赋值,其中,具体赋值过程与上文402一致,此处不再赘述。
[0143]
在一些实现方式中,对于根据用户指令以及第一预设指令共同确定第一指令集的方式,研发人员也可设置变量值,表示用户指令对应的指令集,然后由电子设备处理器根据该变量值、上述第一预设指令的返回值,共同定义该函数接口。其中,该变量值的类型与第一预设指令的返回值类型一致,并且该变量值可以为全局变量。全局变量指的是可作用于整个计算机程序中的变量,设置全局变量的目的在于使该变量能根据电子设备接收到的外界的用户指令的变化而发生改变。如有需要,该变量也可以是局部变量,即仅作用于某个函数内的变量,本技术对此不作限制。在一些实现方式中,全局变量可以为一个也可以为多个,本技术对此不作限制。第一预设指令可参考上文401中相关的描述,此处不再赘述。
[0144]
也即电子设备处理器实质上以用户指令以及第一预设指令之间的优先级,来定义该函数接口。可以理解,用户指令的优先级自然要比预设设置的第一预设指令的优先级高,因此,一般情况下,电子设备处理器根据用户指令定义该函数接口,但为避免用户指令有误,导致定义函数接口发生错误,致使计算机程序运行错误,故还需进一步结合第一预设指令的返回值,定义上述函数接口。
[0145]
在一些实现方式中,可通过将全局变量的值与第一预设指令的返回值做与运算,得到第一结果,然后根据第一结果定义该函数接口。可以理解,在此实现方式中,全局变量的数据类型与上文第一预设指令返回值的数据类型应一致。
[0146]
举例来说明,以全局变量为bool型数据、全局变量是use_avx和use_sse为例,其中,use_avx是根据用户指令确定电子设备处理器是否支持avx指令集,use_sse是根据用户指令确定电子设备处理器是否支持sse指令集。示例性地,全局变量的值与用户指令之间的关系可如下表4所示:
[0147]
表4
[0148][0149]
也即当用户指令为“avx”时,use_avx的值为true,且use_sse的值为false,当用户指令为“sse”时,use_avx的值为false,且use_sse的值为true,当用户指令为“auto”时,为使电子设备自动选择指令集的过程可以顺利进行,use_avx与use_sse的值均为true。
[0150]
基于上表5所示的全局变量的值与用户指令之间的关系,全局变量与第一预设指令返回值之间的与运算后的第一结果可如下表5所示:
[0151]
表5
[0152][0153]
基于上表5所示的第一结果,继续以函数接口为函数指针fvec_inner_product为例,示例性地,第一结果以及函数指针fvec_inner_product的值之间的对应关系可如下表6所示:
[0154]
表6
[0155][0156]
即当用户指令为“avx”时,use_avx为true,bool cpu_support_avx()的返回值也为true,use_sse为true,bool cpu_support_sse()的返回值也为true,因此use_avx&&bool cpu_support_avx()返回值的第一结果为true,且use_sse&&boolcpu_support_sse()返回值为true,因此,函数指针fvec_inner_product的取值为fvec_inner_product_avx。
[0157]
当用户指令为“sse”时,use_avx为false,bool cpu_support_avx()的返回值也为false,use_sse为true,bool cpu_support_sse()的返回值也为true,因此use_avx&&bool cpu_support_avx()返回值的第一结果为false,且use_sse&&boolcpu_support_sse()返回值为true,因此,函数指针fvec_inner_product的取值为fvec_inner_product_sse。
[0158]
当用户指令为“auto”时,use_avx为true,use_sse也为true,此时函数指针fvec_inner_product的取值的确定与上述402的方法一致,即以第一预设指令返回值(bool cpu_support_avx()的返回值以及bool cpu_support_sse()的返回值)为准。
[0159]
具体地,如果bool cpu_support_avx()为true,则bool cpu_support_sse()也必然为true,因此use_avx&&bool cpu_support_avx()返回值的第一结果为true,且use_sse&&bool cpu_support_sse()返回值也为true,此时函数指针fvec_inner_product的取值为fvec_inner_product_avx。
[0160]
如果bool cpu_support_avx()为false,则bool cpu_support_sse()为true,因此use_avx&&bool cpu_support_avx()返回值的第一结果为false,且use_sse&&boolcpu_support_sse()返回值为true,此时函数指针fvec_inner_product的取值为fvec_inner_product_sse。
[0161]
503,执行所述第一函数的第一指令集实现方式,以实现所述第一函数的功能。此处与上述方法400中403一致,具体可参考上文相关描述,不再赘述。
[0162]
通过上述方法可减轻研发人员的工作量,降低研发成本,同时该方法也可确保计算机程序能在支持任何指令集的电子设备处理器上运行成功,同时该方法引入人机交互的过程,不仅满足专业用户的需求(例如专业用户可以直接选择电子设备处理器支持的指令集),也可满足非专业用户的需求(例如非专业用户可以选择上述自动模式(auto)),扩大了计算机程序的用户范围,提高了用户体验。
[0163]
图7示出了本技术实施例中的一种计算机程序处理装置700的框图。在一些实现方式中,装置700用于运行计算机程序或上文所述的镜像文件,该装置700包括第一模块701,第二模块702以及第三模块703。
[0164]
第一模块701,第一模块701用于初始化计算机程序,并获取处理器支持的第一指令集,其中,计算机程序包括第一函数,第一函数与第一函数接口对应,第一函数接口用于获取第一函数的多个不同指令集的实现方式中的任一实现方式;
[0165]
第二模块702,第二模块702用于基于第一指令集,通过第一函数接口获取第一函数的第一指令集的实现方式;
[0166]
第三模块703,第三模块703用于执行第一函数的实现方式,以实现第一函数的功能。
[0167]
图8示出了本技术实施例中的一种电子设备800的框图。在一个实施例中,电子设备800可以包括一个或多个处理器804,与处理器804中的至少一个连接的系统控制逻辑808,与系统控制逻辑808连接的系统内存812,与系统控制逻辑808连接的非易失性存储器(non-volatile memory,nvm)819,以及与系统控制逻辑808连接的网络接口820。
[0168]
在一些实施例中,处理器804可以包括一个或多个单核或多核处理器。在一些实施例中,处理器804可以包括通用处理器和专用处理器(例如,图形处理器,应用处理器,基带处理器等)的任意组合。
[0169]
在一些实施例中,系统控制逻辑808可以包括任意合适的接口控制器,以向处理器904中的至少一个和/或与系统控制逻辑808通信的任意合适的设备或组件提供任意合适的接口。
[0170]
在一些实施例中,系统控制逻辑808可以包括一个或多个存储器控制器,以提供连接到系统内存812的接口。系统内存812可以用于加载以及存储数据和/或指令。在一些实施例中电子设备800的内存812可以包括任意合适的易失性存储器,例如合适的动态随机存取存储器(dynamic random access memory,dram)。
[0171]
nvm/存储器719可以包括用于存储数据和/或指令的一个或多个有形的、非暂时性的计算机可读介质。在一些实施例中,nvm/存储器819可以包括闪存等任意合适的非易失性存储器和/或任意合适的非易失性存储设备,例如硬盘驱动器(hard disk drive,hdd),光盘(compact disc,cd)驱动器,数字通用光盘(digital versatile disc,dvd)驱动器中的至少一个。
[0172]
nvm/存储器819可以包括安装电子设备800的装置上的一部分存储资源,或者它可以由设备访问,但不一定是设备的一部分。例如,可以经由网络接口820通过网络访问nvm/存储819。
[0173]
特别地,系统内存812和nvm/存储器819可以分别包括:指令824的暂时副本和永久副本。指令824可以包括:由处理器804中的至少一个执行时导致电子设备800实施上述构建方法的指令。在一些实施例中,指令824、硬件、固件和/或其软件组件可另外地/替代地置于系统控制逻辑808,网络接口820和/或处理器804中。
[0174]
网络接口820可以包括收发器,用于为电子设备800提供无线电接口,进而通过一个或多个网络与任意其他合适的设备(如前端模块,天线等)进行通信。在一些实施例中,网络接口820可以集成于电子设备800的其他组件。例如,网络接口820可以集成在处理器804,
系统内存812,nvm/存储器819,和具有指令的固件设备(未示出)中的至少一种,当处理器804中的至少一个执行所述指令时,电子设备800实现上述图4至图5所示的方法。
[0175]
网络接口820可以进一步包括任意合适的硬件和/或固件,以提供多输入多输出无线电接口。例如,网络接口820可以是网络适配器,无线网络适配器,电话调制解调器和/或无线调制解调器。
[0176]
在一个实施例中,处理器804中的至少一个可以与用于系统控制逻辑808的一个或多个控制器的逻辑封装在一起,以形成系统封装(system in package,sip)。在一个实施例中,处理器804中的至少一个可以与用于系统控制逻辑808的一个或多个控制器的逻辑集成在同一管芯上,以形成片上系统(system-on-chip,sec)。
[0177]
电子设备800可以进一步包括:输入/输出(i/o)设备892。i/o设备892可以包括用户界面,使得用户能够与电子设备800进行交互;外围组件接口的设计使得外围组件也能够与电子设备800交互。在一些实施例中,电子设备800还包括传感器,用于确定与电子设备800相关的环境条件和位置信息的至少一种。
[0178]
在一些实施例中,用户界面可包括但不限于显示器(例如,液晶显示器,触摸屏显示器等),扬声器,麦克风,一个或多个相机(例如,静止图像照相机和/或摄像机),手电筒(例如,发光二极管闪光灯)和键盘。
[0179]
在一些实施例中,外围组件接口可以包括但不限于非易失性存储器端口、音频插孔和电源接口。
[0180]
本技术公开的各实施例可以被实现在硬件、软件、固件或这些实现方法的组合中。本技术的实施例可实现为在可编程系统上执行的计算机程序或程序代码,该可编程系统包括至少一个处理器、存储系统(包括易失性和非易失性存储器和/或存储元件)、至少一个输入设备以及至少一个输出设备。
[0181]
可将程序代码应用于输入指令,以执行本技术描述的各功能并生成输出信息。可以按已知方式将输出信息应用于一个或多个输出设备。为了本技术的目的,处理系统包括具有诸如例如数字信号处理器(digital signal processor,dsp)、微控制器、专用集成电路(application specific integrated circuit,asic)或微处理器之类的处理器的任何系统。
[0182]
程序代码可以用高级程序化语言或面向对象的编程语言来实现,以便与处理系统通信。在需要时,也可用汇编语言或机器语言来实现程序代码。事实上,本技术中描述的机制不限于任何特定编程语言的范围。在任一情形下,该语言可以是编译语言或解释语言。
[0183]
在一些情况下,所公开的实施例可以以硬件、固件、软件或其任何组合来实现。所公开的实施例还可以被实现为由一个或多个暂时或非暂时性机器可读(例如,计算机可读)存储介质承载或存储在其上的指令,其可以由一个或多个处理器读取和执行。例如,指令可以通过网络或通过其他计算机可读介质分发。因此,机器可读介质可以包括用于以机器(例如,计算机)可读的形式存储或传输信息的任何机制,包括但不限于,软盘、光盘、光碟、磁光盘、只读存储器(read-only memory,rom)、随机存取存储器(random-access memory,ram)、可擦除可编程只读存储器(eprom)、电可擦除可编程只读存储器(flectrically erasable programmable read only memory,eeprom)、磁卡或光卡、闪存、或用于利用因特网以电、光、声或其他形式的传播信号来传输信息(例如,载波、红外信号数字信号等)的有形的机器
可读存储器。因此,机器可读介质包括适合于以机器(例如,计算机)可读的形式存储或传输电子指令或信息的任何类型的机器可读介质。
[0184]
在附图中,可以以特定布置和/或顺序示出一些结构或方法特征。然而,应该理解,可能不需要这样的特定布置和/或排序。而是,在一些实施例中,这些特征可以以不同于说明性附图中所示的方式和/或顺序来布置。另外,在特定图中包括结构或方法特征并不意味着暗示在所有实施例中都需要这样的特征,并且在一些实施例中,可以不包括这些特征或者可以与其他特征组合。
[0185]
需要说明的是,本技术各设备实施例中提到的各单元/模块都是逻辑单元/模块,在物理上,一个逻辑单元/模块可以是一个物理单元/模块,也可以是一个物理单元/模块的一部分,还可以以多个物理单元/模块的组合实现,这些逻辑单元/模块本身的物理实现方式并不是最重要的,这些逻辑单元/模块所实现的功能的组合才是解决本技术所提出的技术问题的关键。此外,为了突出本技术的创新部分,本技术上述各设备实施例并没有将与解决本技术所提出的技术问题关系不太密切的单元/模块引入,这并不表明上述设备实施例并不存在其它的单元/模块。
[0186]
需要说明的是,在本专利的示例和说明书中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
[0187]
虽然通过参照本技术的某些优选实施例,已经对本技术进行了图示和描述,但本领域的普通技术人员应该明白,可以在形式上和细节上对其作各种改变,而不偏离本技术的范围。
技术特征:1.一种计算机程序的处理方法,应用于电子设备,所述电子设备包括处理器,其特征在于,包括:初始化所述计算机程序,并获取所述处理器支持的第一指令集,其中,所述计算机程序包括第一函数,所述第一函数与第一函数接口对应,所述第一函数接口用于获取所述第一函数的多个不同指令集的实现方式中的任一实现方式;基于所述第一指令集,通过所述第一函数接口获取所述第一指令集的实现方式;执行所述第一指令集的实现方式,以实现所述第一函数的功能。2.根据权利要求1所述的方法,其特征在于,所述计算机程序包括所述第一函数的多个不同指令集的实现方式,且所述第一函数的多个不同指令集的实现方式对应多个函数名,以及基于所述第一指令集,通过所述第一函数接口获取所述第一指令集的实现方式,包括:基于所述第一指令集以及所述第一函数,确定第一函数名,所述第一函数名是与所述第一指令集的实现方式对应的函数名;通过所述第一函数接口以及所述第一函数名,获取所述第一指令集的实现方式;利用所述第一指令集函数分组对应的第一编译参数,对所述第一函数的实现方式执行编译,以实现所述第一函数的功能。3.根据权利要求1所述的方法,其特征在于,所述初始化所述计算机程序,并获取所述处理器支持的第一指令集,包括:获取第一预设指令,所述第一预设指令是从所述计算机程序获取的;确定与所述第一预设指令对应的返回值;根据所述返回值确定所述处理器支持的第一指令集,其中,所述返回值表示所述处理器是否支持与所述第一预设指令对应的指令集。4.根据权利要求3所述的方法,其特征在于,所述返回值的类型包括布尔型数据,所述根据所述返回值确定所述处理器支持的第一指令集,包括:若所述返回值为第一值,所述处理器支持与所述第一预设指令对应的指令集;若所述返回值为不同于第一值的第二值,所述处理器不支持与所述第一预设指令对应的指令集。5.根据权利要求4所述的方法,其特征在于,所述函数接口包括函数指针,所述函数指针根据所述返回值与所述第一预设条件的关系确定,若所述返回值中存在第一值,所述函数指针指向与所述第一预设指令相关的指令集的所述第一函数的实现方式;若所述返回值均为第二值,所述函数指针指向预设函数实现方式。6.根据权利要求1所述的方法,其特征在于,所述初始化所述计算机程序,并获取所述处理器支持的第一指令集,包括:获取用户指令以及第一预设指令,所述第一预设指令是从所述计算机程序获取的;获取响应于所述第一预设指令输出的指示所述处理器支持的第一指令集的数据,以获取所述处理器支持的第一指令集,在所述用户指令表征的所述处理器支持的指令集与所述第一预设指令确定的所述处理器支持的第一指令集一致的情况下,以所述用户指令表征的所述处理器支持的指令集作为第一指令集;
在所述用户指令表征的所述处理器支持的指令集与所述第一预设指令确定的所述处理器支持的第一指令集不一致的情况下,以所述第一预设指令确定的指令集作为所述第一指令集。7.根据权利要求6所述的方法,其特征在于,获取响应于所述第一预设指令输出的指示所述处理器支持的第一指令集的数据,以获取所述处理器支持的第一指令集,包括:根据所述第一预设指令对应的返回值确定所述处理器支持的第一指令集,所述返回值表示所述处理器是否支持与所述第一预设指令对应的指令集,所述返回值的类型包括布尔型数据,若所述返回值为第一值,所述处理器支持与所述第一预设指令对应的指令集;若所述返回值为不同于第一值的第二值,所述处理器不支持与所述第一预设指令对应的指令集。8.根据权利要求7所述的方法,其特征在于,所述函数接口包括函数指针,所述函数指针指向所述用户指令对应的变量值与所述返回值做与运算后,结果为第一值时对应的指令集中的所述第一函数的实现方式。9.根据权利要求6所述的方法,其特征在于,所述方法还包括:在初始化所述计算机程序的过程中,显示第一用户界面,所述第一用户界面用于提示用户输入所述用户指令。10.一种计算机程序运行装置,所述装置用于运行所述计算机程序,其特征在于,包括:第一模块,所述第一模块用于初始化所述计算机程序,并获取当前装置处理器支持的第一指令集,其中,所述计算机程序包括第一函数,所述第一函数与第一函数接口对应,所述第一函数接口用于获取所述第一函数的多个不同指令集的实现方式中的任一实现方式;第二模块,所述第二模块用于基于所述第一指令集,通过所述第一函数接口获取所述第一函数的第一指令集的实现方式;第三模块,所述第三模块用于执行所述第一函数的实现方式,以实现所述第一函数的功能。11.一种计算机可读介质,其特征在于,所述计算机可读介质上存储有指令,该指令在电子设备上执行时使电子设备执行权利要求1至9中任一项所述的方法。12.一种电子设备,其特征在于,所述电子设备包括:存储器,用于存储由电子设备的一个或多个处理器执行的指令,以及处理器,是电子设备的处理器之一,用于执行权利要求1至9中任一项所述的方法。
技术总结本申请涉及计算机技术领域,尤其涉及一种计算机程序的处理方法和电子设备。本申请方法在计算机程序中定义了一种函数接口,该函数接口能访问不同指令集,从而获取并实现不同的函数功能,使用户电子设备运行包括向量数据库程序在内的各计算机程序时,能够基于用户电子设备处理器支持的第一指令集,获取并执行计算机程序的第一指令集的函数实现方式,进而实现计算机程序的功能。通过这种方法,提高包括向量数据库程序在内的各计算机程序可适用的指令集范围,进而提高计算机程序可适用的电子设备的范围,降低对电子设备处理器支持指令集的依赖,使用户下载使用计算机程序更加方便,提高用户体验。用户体验。用户体验。
技术研发人员:谢超 蔡宇东 刘晓云 栾小凡
受保护的技术使用者:上海徐毓智能科技有限公司
技术研发日:2022.07.25
技术公布日:2022/11/1