一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

用于数据召回的FPGA芯片和数据召回方法与流程

2022-05-26 20:27:21 来源:中国专利 TAG:

用于数据召回的fpga芯片和数据召回方法
技术领域
1.本公开涉及数据处理技术领域,具体地,涉及一种用于数据召回的fpga芯片和数据召回方法。


背景技术:

2.图1示出了相关技术中数据处理系统的简化流程图。如图1所示,在一些数据处理场景中,首先需要从若干的待处理数据中召回一部分数据,然后对召回的数据中进行粗排序,筛选出一小部分数据进入精排序,在完成精排序后,按照精排序的结果,将筛选出的数据作为后续使用的数据,例如可展示给用户。为了从若干待处理数据中召回一部分数据,将每个待处理数据表示为一个候选向量,在召回步骤中,计算预设向量与候选向量的点积,并将若干个点积进行排序,从而根据排序结果召回对应的待处理数据。
3.在一些数据处理场景中,召回过程承担着过滤上亿候选向量的任务。目前相关技术中,利用cpu(或gpu)计算出所有点积后,将所有点积存到外部存储器中,然后再对外部存储器中的所有点积进行排序,这种方式会占用外存的访问带宽,而且,由于需要遍历每个候选向量来计算点积,在没有任何算法优化的情况下,只能采用暴力搜索算法,才能遍历到每一个候选向量,此时,cpu的内存带宽将会成为影响遍历候选向量速度的瓶颈因素。


技术实现要素:

4.提供该部分内容以便以简要的形式介绍构思,这些构思将在后面的具体实施方式部分被详细描述。该部分内容并不旨在标识要求保护的技术方案的关键特征或必要特征,也不旨在用于限制所要求的保护的技术方案的范围。
5.第一方面,本公开提供一种用于数据召回的fpga芯片,包括:
6.多个存储模块,用于存储多个候选向量,每个候选向量对应一个待处理数据;
7.多个点积计算模块,用于在每p个时钟周期,并行从对应的存储模块中读取候选向量,计算所述候选向量与预设向量的点积,得到对应的点积数据,其中p是根据读取一个所述候选向量需要消耗的时间确定的,p为正整数;
8.排序模块,用于在每个时钟周期读取所述点积数据,并根据读取的所述点积数据进行排序操作,在经过多个时钟周期后,输出相应的有序数组,所述有序数组包括降序排列的多个点积数据,且所述有序数组中每个点积数据对应一个被召回的待处理数据。
9.第二方面,本公开提供一种数据召回方法,应用于fpga芯片,所述fpga芯片包括多个存储模块、多个点积计算模块以及排序模块,每个存储模块中分别存储多个候选向量,且每个候选向量对应一个待处理数据;所述方法包括:
10.在每p个时钟周期,所述多个点积计算模块并行从对应的存储模块中读取候选向量,计算所述候选向量与预设向量的点积,得到对应的点积数据,其中p是根据读取一个所述候选向量需要消耗的时间确定的,p为正整数;
11.在每个时钟周期,所述排序模块读取所述点积数据,并根据读取的所述点积数据
进行排序操作,在经过多个时钟周期后,输出相应的有序数组,所述有序数组包括降序排列的多个点积数据,且所述有序数组中每个点积数据对应一个被召回的待处理数据。
12.在上述方案中,点积计算过程与排序过程可以完全流水式地执行起来,点积计算模块每p个时钟周期算完一个点积数据后,这个点积数据将会传递给排序模块进行排序,同时,点积计算模块将会继续从存储模块中读取候选向量并计算新的点积数据,相当于每个时钟周期,每个模块都在并行工作,当点积计算完成时,排序过程也基本上完成,可以极大提升召回效率,而且,排序的实现不占用额外的外存带宽。此外,通常情况下,fpga芯片内可集成高带宽内存,内存带宽将远高于cpu的内存带宽,从而解决cpu内存带宽对候选向量遍历速率的限制,可以降低候选向量集的遍历时间。
13.本公开的其他特征和优点将在随后的具体实施方式部分予以详细说明。
附图说明
14.结合附图并参考以下具体实施方式,本公开各实施例的上述和其他特征、优点及方面将变得更加明显。贯穿附图中,相同或相似的附图标记表示相同或相似的元素。应当理解附图是示意性的,原件和元素不一定按照比例绘制。在附图中:
15.图1是相关技术中数据处理系统的简化流程图;
16.图2是本公开实施例提供的fpga芯片的示意图;
17.图3是本公开实施例中多个候选向量在多个存储模块中存储和被读取的示意图;
18.图4是本公开实施例提供的fpga芯片中排序模块的示意图;
19.图5是排序模块实现top 8排序的过程中部分时钟周期的示意图;
20.图6是排序模块实现top 8排序的过程中部分时钟周期的示意图;
21.图7是本公开实施例提供的fpga芯片的又一示意图;
22.图8是本公开实施例提供的数据召回方法的流程图;
23.图9是本公开实施例提供的数据召回方法的又一流程图;
24.图10是本公开实施例提供的数据召回方法的又一流程图。
25.附图标记:
26.110-存储模块;120-点积计算模块;130-排序模块;131-比较器模块;132-逻辑处理模块;140-过滤模块;150-多路选择器。
具体实施方式
27.下面将参照附图更详细地描述本公开的实施例。虽然附图中显示了本公开的某些实施例,然而应当理解的是,本公开可以通过各种形式来实现,而且不应该被解释为限于这里阐述的实施例,相反提供这些实施例是为了更加透彻和完整地理解本公开。应当理解的是,本公开的附图及实施例仅用于示例性作用,并非用于限制本公开的保护范围。
28.应当理解,本公开的方法实施方式中记载的各个步骤可以按照不同的顺序执行,和/或并行执行。此外,方法实施方式可以包括附加的步骤和/或省略执行示出的步骤。本公开的范围在此方面不受限制。
29.本文使用的术语“包括”及其变形是开放性包括,即“包括但不限于”。术语“基于”是“至少部分地基于”。术语“一个实施例”表示“至少一个实施例”;术语“另一实施例”表示“至少一个另外的实施例”;术语“一些实施例”表示“至少一些实施例”。其他术语的相关定义将在下文描述中给出。
30.需要注意,本公开中提及的“第一”、“第二”等概念仅用于对不同的装置、模块或单元进行区分,并非用于限定这些装置、模块或单元所执行的功能的顺序或者相互依存关系。
31.需要注意,本公开中提及的“一个”、“多个”的修饰是示意性而非限制性的,本领域技术人员应当理解,除非在上下文另有明确指出,否则应该理解为“一个或多个”。
32.本公开实施方式中的多个装置之间所交互的消息或者信息的名称仅用于说明性的目的,而并不是用于对这些消息或信息的范围进行限制。
33.如背景技术所述,相关技术中一般采用cpu来完成召回任务,且在召回时需要先遍历每个候选向量,在计算完每个候选向量与预设向量的点积后,再将所有点积存到外存中,再统一对外存中的点积进行排序,这会额外占用外存的访问带宽,同时,cpu的内存带宽也会成为影响遍历候选向量速度的瓶颈因素。
34.由此,本公开实施例提供一种fpga(field programmable gate array,现场可编程逻辑门阵列)芯片,通过该fpga芯片来加速执行数据召回任务。图2示出了本公开实施例提供的fpga芯片的示意图,如图2所示,该fpga芯片包括:多个存储模块110,多个点积计算模块120和排序模块130。
35.其中,每个存储模110分别存储多个候选向量,每个候选向量是一个待处理数据的向量化表示。
36.其中,多个点积计算模块120与多个存储模块110一一对应,多个点积计算模块120用于,在每p个时钟周期,并行从对应的存储模块110中读取候选向量,计算该候选向量与预设向量的点积,得到对应的点积数据。其中p是根据读取一个候选向量需要消耗的时间确定的,且p为正整数。其中,预设向量可以是表示用户的用户向量,或者根据其他方式预设的向量。
37.示例性的,当点积计算模块能够在一个时钟周期内读完一个候选向量时,p=1,每个点积计算模块将在每个时钟周期从对应的存储模块中读取一个候选向量。当候选向量的大小不足以使得点积计算模块在一个时钟周期内读完一个候选向量时,点积计算模块在下一个时钟周期仍然在读取上一个时钟周期未读取完的候选向量,直至该候选向量读取完毕。因此,每个点积计算模块每p个时钟周期读取一个候选向量。可以理解的是,点积计算模块可以边读取候选向量边计算已读取的部分候选向量与预设向量的点积,得到已读取的部分候选向量对应的点积数据,同时还能将各个已读取的部分候选向量对应的点积数据进行累加,当该候选向量读取完毕时,该候选向量对应的点积数据也已经计算完毕。
38.其中,排序模块130用于,在每个时钟周期读取点积数据,并根据读取的点积数据进行排序操作,在经过多个时钟周期后,输出相应的有序数组,该有序数组包括降序排列的多个点积数据,且其中的每个点积数据对应一个被召回的待处理数据。
39.可以理解的,排序模块130的作用是,根据点积计算模块计算出的点积数据进行top k排序,也就是在多个点积数据中确定出排在前列的k个点积数据,并输出包含该排在前列的k个点积数据的有序数组,从而根据该有序数组中的k个点积数据,从海量待处理数据中召回与预设向量匹配的k个待处理数据。
40.进一步的,fpga芯片内集成了hbm(high bandwidth memory,高带宽内存),每个存
储模块对应hbm的一块存储空间。另外,hbm还包括多个通道,每个通道提供对应的存储模块与外部连接的接口,每个点积计算模块可通过hbm上的对应通道从对应的存储模块读取点积数据。该fpga芯片包括m个存储模块、m个通道和m个点积计算模块,m为正整数。在一种实施例中,hbm共有32个通道,则该fpga芯片包括32个存储模块、32个通道和32个点积数据模块。
41.其中,假设共有q个候选向量(q为正整数),共代表q个待处理数据,q个候选向量是通过如下方式存储在m个存储模块中:
42.按照m个存储模块之间的预设顺序,依次将m个候选向量存储到对应的存储模块中,并循环上述过程,直至q个候选向量均被存储;其中,同一存储模块存储的各候选向量中,相邻候选向量之间的存储地址连续。
43.以m=32为例,图3示出了本公开实施例中多个候选向量在多个存储模块中存储和被读取的示意图。如图3所示,首先将q个候选向量中候选向量1存储在存储模块1中,将候选向量2存储在存储模块2中,以此类推,将候选向量32存储在存储模块32中,从而完成将q个候选向量中的32个候选向量分别存储在32个存储模块中;然后继续存储32个候选向量到32个存储模块中,其中,将候选向量33存储到存储模块1中,将候选向量34存储到存储模块2中,以此类推,将候选向量64存储到存储模块32中,然后继续以此循环。在q个候选向量中剩余不足32个候选向量时,将剩余候选向量按照存储模块1到存储模块32的顺序依次存储,直至所有候选向量存储完毕。
44.其中,每个存储模块中的候选向量以存储地址连续的方式进行存储,相邻两个候选向量之间的存储地址连续。如存储模块1中,候选向量33的存储地址与候选向量1的存储地址连续。
45.可以理解的,q个候选向量是通过上述方式预先顺序存储在m个存储模块中的,当有新的候选向量加入时,将新加入的候选向量按照存储模块1到存储模块32的顺序依次存储,并以此循环。
46.可以理解的,顺序存储意味着顺序读取,而顺序读取的效率会明显高于随机读取。在从m个存储模块中读取候选向量时,每个点积计算模块在每p个时钟周期,根据连续的存储地址从对应的存储模块中顺序读取一个候选向量,然后将读取的候选向量与预设向量计算点积,得到点积数据。
47.这种存储和读取的方式,在暴力计算、ivf(inverted files,逆向索引)场景,能在hbm中连续访问候选向量,提高各通道的带宽利用率,而且,各个通道访问的数据量相同,访问均匀,可以提高整体带宽利用率。经实际测得,fpga芯片的内存带宽能达到414gb/s(实测值),远高于cpu的内存带宽(60gb/s,实测值),从而解决cpu内存带宽对候选向量遍历速率的限制,可以降低候选向量集的遍历时间。而且,单张fpga芯片的内存带宽414gb/s相比服务器cpu的内存带宽60gb/s提升6.9倍,如果一台服务器主机上插接4张fpga芯片,则可提升27.6倍,遍历速率的增长十分显著。
48.可选的,图4示出了本公开实施例提供的fpga芯片中排序模块的示意图,排序模块130包括依次连接的s 1个比较器模块131。
49.其中,在前s个比较器模块中,第i个比较器模块用于,在每至少2i个时钟周期,对连续输入到该比较器模块的2i个点积数据进行一轮排序,以有序向下一个比较器模块输出
该连续输入的2i个点积数据,i为整数,且1≤i≤s。
50.第s 1个比较器模块用于,在每至少k个时钟周期,将连续输入到该比较器模块的2s个(k个)点积数据与当前的参考缓存队列中的k个点积数据进行一轮排序,以有序向当前的输出缓存队列中写入排在前列的k个点积数据,其中,k=2s。
51.第s 1个比较器模块还用于,在完成对所有点积数据的排序后,输出包含排序完成时输出缓存队列中的k个点积数据的有序数组。
52.其中,参考缓存队列用于存储第s 1个比较器模块前一轮排序得到的排在前列的k个点积数据,输出缓存队列用于存储第s 1个比较器模块本轮排序得到的排在前列的k个点积数据。
53.在一示例性实施例中,在前s个比较器模块中,每个比较器模块各对应两个缓存队列,第i个比较器模块通过以下方式对连续输入的2i个点积数据进行一轮排序:
54.在每个时钟周期读取输入到该比较器模块的一个点积数据,并将点积数据写入到对应的两个缓存队列中的相应队列;其中,每连续输入的2
i-1
个点积数据被写入到同一个队列中;
55.在每个时钟周期比较两个缓存队列中位于队头的两个点积数据,并向下一个比较器模块输出位于队头的两个点积数据中的较大者;
56.将本轮排序的2i个点积数据作为目标点积数据,当本轮排序已输出其中一个缓存队列中的2
i-1
个目标点积数据时,在之后的每个时钟周期依次向下一个比较器模块输出一个另一缓存队列中剩余的目标点积数据,直至两个缓存队列中的共2i个目标点积数据均已输出,本轮排序完成。
57.在一示例性实施例中,第s 1个比较器模块对应三个缓存队列,分别为输入缓存队列,参考缓存队列和输出缓存队列。第s 1个比较器模块通过以下方式将连续输入的2s个点积数据与当前的参考缓存队列中的k个点积数据进行一轮排序:
58.在每个时钟周期读取输入到该比较器模块的一个点积数据,并将点积数据写入到输入缓存队列中;其中,输入缓存队列在第s 1个比较器模块每完成一轮排序后被清空;
59.在每个时钟周期比较输入缓存队列与当前的参考缓存队列中位于队头的两个点积数据,并向当前的输出缓存队列中写入位于队头的两个点积数据中的较大者,直至本轮排序已向输出缓存队列中连续写入k个点积数据后,本轮排序完成。
60.其中,参考缓存队列和输出缓存队列可能是变化的,参考缓存队列和输出缓存队列间可以相互切换。如图4所示,排序模块130还包括逻辑处理模块132。逻辑处理模块132用于,每当第s 1个比较器模块完成一轮排序后,将输入缓存队列和当前的参考缓存队列中剩余的点积数据清空,然后将当前的输出缓存队列切换为新的参考缓存队列,将当前的参考缓存队列切换为新的输出缓存队列。
61.作为一种示例,第s 1个比较器模块通过参考指针从对应的缓存队列中读取点积数据,以及通过输出指针向对应的缓存队列写入点积数据,输出指针指向的缓存队列即为输出缓存队列,参考指针指向的缓存队列即为参考缓存队列,因此,将当前的输出缓存队列切换为新的参考缓存队列,以及将当前的参考缓存队列切换为新的输出缓存队列,可以通过更改输出指针和参考指针指向的地址来实现。例如,逻辑处理模块132将原本指向缓存队列a的参考指针更改为指向缓存队列b的队头位置,将原本指向缓存队列b的输出指针更改
为指向缓存队列a的队头位置,从而,缓存队列a的身份由原本的参考缓存队列更改为输出缓存队列,缓存队列b的身份由原本的输出缓存队列更改为参考缓存队列,实现参考缓存队列与输出缓存队列的互换。
62.可以理解的,在上述过程中,第1个比较器模块的本质是向下一级的第2个比较器模块输出一组排好序的2个点积数据,第2个比较器模块的本质是根据第1个比较器模块输入的两组排好序的2个点积数据,向下一级的第3个比较器模块输出一组排好序的4个点积数据,第3个比较器模块的本质是根据第2个比较器模块输入的两组排好序的4个点积数据,向下一级的第4个比较器模块输出一组排好序的8个点积数据,以此类推,第s个比较器模块的本质是根据第s-1个比较器模块输入的两组排好序的2
s-1
个点积数据,向下一级的第s 1个比较器模块输出一组排好序的2s个点积数据,即一组排好序的k个点积数据,第s 1个比较器模块的本质是根据第s个比较器模块输出的k个点积数据与参考缓存队列中的k个点积数据,取其中最大的k个点积数据写入到输出缓存队列中,舍弃剩余的k个点积数据。
63.因此,利用逻辑处理模块和依次连接的s 1个比较器模块,可实现top k排序,即得到排在前列的k个点积数据。
64.fpga的一项重要特点是其可编程特性,即可通过程序指定fpga实现某一特定数字电路,因此可通过编程设置排序模块中比较器模块的数量,从而实现不同k值的排序。为便于理解,在一示例性实施例中,以k=8为例,图5~图6示出了上述排序模块的top 8排序过程示意图,参照图5~图6,下面对top 8排序过程进行说明。需要注意的是,图5~图6仅简易示出了top 8排序过程中部分时钟周期的示意图,并未一一列举每个时钟周期每个缓存队列的所有情况。
65.在本实施例中,排序模块包括逻辑处理模块以及依次连接的4个比较器模块,分别为比较器模块1,比较器模块2,比较器模块3和比较器模块4,比较器模块1~3各对应两个缓存队列,分别为上缓存队列和下缓存队列,比较器模块4则对应三个缓存队列,分别为输入缓存队列、输出缓存队列和参考缓存队列。
66.示例性的,每个点积数据包括点积的数值,假设输入的数值序列为:
67.4,3,5,6,1,7,14,0,2,10,16,13,11,17,20,12;
68.首先,介绍比较器模块1的排序过程:
69.其中,根据上述数值序列在每个时钟周期向比较器模块1输入一个数。
70.其中,比较器模块1将每连续输入的2个数按降序依次有序输出。
71.在一个时钟周期,数4进入比较器模块1并被写入到上缓存队列;
72.在下个时钟周期,数3进入比较器模块1并被写入到下缓存队列,比较器模块1比较上缓存队列中位于队头的数4和下缓存队列中位于队头的数3,输出数4到比较器模块2;
73.在下个时钟周期,数5进入比较器模块1并被写入到上缓存队列,比较器模块1输出下缓存队列中的数3到比较器模块2,从而比较器模块1完成对数4和数3的一轮排序,以及在连续的两个时钟周期内向比较器模块2输出了一组有序的2个数:(4,3);
74.在下个时钟周期,数6进入比较器模块1并被写入到下缓存队列,比较器模块1开始新一轮的排序,比较位于队头的数5和数6,输出数6到比较器模块2;
75.以此类推,比较器模块1在经历八轮排序后,可输出八组有序的2个数:
76.(4,3),(6,5),(7,1),(14,0),(10,2),(16,13),(17,11),(20,12)。
77.然后,介绍比较器模块2的排序过程:
78.其中,比较器模块2将比较器模块1输入的一组有序的2个数写入到同一缓存队列中,并将每连续输入的4个数按降序依次有序输出。
79.其中,比较器模块2将比较器模块1输入的(4,3)依次写入到上缓存队列。
80.在一个时钟周期,下一组(6,5)中的数6进入到比较器模块2后被写入到下缓存队列,比较器模块2比较上缓存队列中位于队头的4和下缓存队列中位于队头的6,输出数6到比较器模块3;
81.在下个时钟周期,下一个数5进入到比较器模块2并同样写入到下缓存队列,比较器模块2比较上缓存队列中位于队头的4和下缓存队列中位于队头的5,输出数5到比较器模块3;
82.在下个时钟周期,下下组(7,1)中的数7进入比较器模块2并被写入到上缓存队列,比较器模块2输出数4;
83.在下个时钟周期,下下组(7,1)中的数1进入比较器模块2并被写入到上缓存队列,比较器模块2输出数3,从而比较器模块2完成对(4,3)和(6,5)的一轮排序,以及在连续的4个时钟周期内向比较器模块3输出了一组有序的4个数:(6,5,4,3);
84.在下个时钟周期,下下下组(14,0)中的数14进入比较器模块2并被写入到下缓存队列,比较器模块2开始新一轮的排序。
85.从上述过程可见,经历4个时钟周期,比较器模块2已将比较器模块1输入的两组有序的2个数(4,3)和(6,5)排列成一组有序的4个数进行输出,即(6,5,4,3)。
86.以此类推,比较器模块2在经历四轮排序后,可输出四组有序的4个数:
87.(6,5,4,3),(14,7,1,0),(16,13,10,2),(20,17,11,12)。
88.然后,介绍比较器模块3的排序过程:
89.其中,比较器模块3将比较器模块2输入的一组有序的4个数写入到同一缓存队列中,并将每连续输入的两组共8个数按降序依次有序输出。
90.其中,比较器模块3将比较器模块2输入的(6,5,4,3)依次写入到上缓存队列。
91.在一个时钟周期,下一组(14,7,1,0)中的数14进入到比较器模块3后被写入到下缓存队列,比较器模块3比较上缓存队列中位于队头的6和下缓存队列中位于队头的14,输出数14到比较器模块4;
92.在下个时钟周期,下一个数7进入到比较器模块3并写入到下缓存队列,比较器模块3比较上缓存队列中位于队头的6和下缓存队列中位于队头的7,输出数7到比较器模块4;
93.在下个时钟周期,下一个数1进入到比较器模块3并写入到下缓存队列,比较器模块3比较上缓存队列中位于队头的6和下缓存队列中位于队头的1,输出数6到比较器模块4;
94.在下个时钟周期,下一个数0进入到比较器模块3并写入到下缓存队列,比较器模块3比较上缓存队列中位于队头的5和下缓存队列中位于队头的1,输出数5到比较器模块4;
95.在下个时钟周期,下一组(16,13,10,2)中的数16进入到比较器模块3并写入到上缓存队列,比较器模块3比较上缓存队列中位于队头的4和下缓存队列中位于队头的1,输出数4到比较器模块4;
96.在下个时钟周期,下一组(16,13,10,2)中的数13进入到比较器模块3并写入到上缓存队列,比较器模块3比较上缓存队列中位于队头的3和下缓存队列中位于队头的1,输出
数3到比较器模块4;
97.在下个时钟周期,下一组(16,13,10,2)中的数10进入到比较器模块3并写入到上缓存队列,比较器模块3输出数1到比较器模块4;
98.在下个时钟周期,下一组(16,13,10,2)中的数2进入到比较器模块3并写入到上缓存队列,此时该组(16,13,10,2)中的4个有序的数已均被写入到上缓存队列中;比较器模块3输出数0到比较器模块4;从而比较器模块3完成对(6,5,4,3)和(14,7,1,0)的一轮排序,以及在连续的8个时钟周期内向比较器模块4输出了一组有序的8个数:(14,7,6,5,4,3,1,0);
99.在下个时钟周期,下下组(20,17,11,12)中的数20进入到比较器模块3并写入到下缓存队列,比较器模块3开启新一轮的排序,具体过程不再重复。
100.从上述过程可见,经历8个时钟周期,已将比较器模块2输入的两组有序的4个数(6,5,4,3)和(14,7,1,0)排列成一组有序的8个数进行输出,即(14,7,6,5,4,3,1,0)。
101.以此类推,比较器模块3在经历两轮排序后,可输出两组有序的8个数:
102.(14,7,6,5,4,3,1,0),(20,17,16,13,12,11,10,2)。
103.然后,介绍比较器模块4的排序过程:
104.其中,比较器模块4将比较器模块3输入的数依次写入到输入缓存队列中,在最开始时,第一组(14,7,6,5,4,3,1,0)中的数14首先输入到比较器模块4,并写入到输入缓存队列,由于参考缓存队列为空,所以直接将输入缓存队列中位于队头的14写入到输出缓存队列中;
105.参见图6,在经历8个时钟周期后,比较器模块4完成了一轮排序,即得到当前最大的8个数,此时输出缓存队列包括(14,7,6,5,4,3,1,0),然后逻辑处理模块将输入缓存队列和参考缓存队列清空,并将当前的输出缓存队列与当前的参考缓存队列互换,即当前的输出缓存队列切换为新的参考缓存队列,当前的参考缓存队列切换为新的输出缓存队列。
106.此时,新的参考缓存队列中包括(14,7,6,5,4,3,1,0),新的输出缓存队列为空。
107.然后,在一个时钟周期,下一组(20,17,16,13,12,11,10,2)的数20进入到比较器模块4,并写入到输入缓存队列,比较参考缓存队列中位于队头的14与输入缓存队列中位于队头的20,输出数20并将其写入到输出缓存队列;
108.在下个时钟周期,下一个数17进入比较器模块4并写入到输入缓存队列,比较参考缓存队列中位于队头的14与输入缓存队列中位于队头的17,输出17并将其写入到输出缓存队列;
109.在下个时钟周期,下一个数16进入比较器模块4并写入到输入缓存队列,比较参考缓存队列中位于队头的14与输入缓存队列中位于队头的16,在该时钟周期输出16并将其写入到输出缓存队列;
110.重复上述过程,在经历8个时钟周期后,比较器模块4已将比较器模块3输出的两组有序的8个数(14,7,6,5,4,3,1,0)和(20,17,16,13,12,11,10,2)排列成一组有序的8个数,即(20,17,16,14,13,12,11,10),从而完成了一轮排序。
111.此时,输入缓存队列中剩余1个数(2),参考缓存队列中剩余7个数(7,6,5,4,3,1,0)。
112.由于此时已经完成对输入的数值序列中所有数的排序,因此,比较器模块4根据当前输出缓存队列中的数,输出相应的有序数组,有序数组为[20,17,16,14,13,12,11,10]。
[0113]
需要说明的是,假设输入的数值序列不止上述列举的16个数,则在比较器模块4完成本轮排序后,由于输入缓存队列和参考缓存队列中剩余的数均小于输出缓存队列中位于队尾的最小值,则需要将输入缓存队列和参考缓存队列中的数清空,于是将输入缓存队列中剩余的1个数(2)和参考缓存队列中剩余的7个数(7,6,5,4,3,1,0)清空。然后,互换输出缓存队列和参考缓存队列,从而,新的参考缓存队列包括(20,17,16,14,13,12,11,10),并在之后的时钟周期,将新的参考缓存队列中的数继续与输入缓存队列中的数比较,继续产生有序的8个数。
[0114]
需要说明的是,在本公开实施例中,点积计算过程与排序过程,以及排序过程中每个比较器模块执行的每轮排序,可以完全流水式地执行起来,点积计算模块每p个时钟周期算完一个点积数据后,这个点积数据将会传递给排序模块进行排序,同时,点积计算模块将会继续从存储模块中读取候选向量并计算新的点积数据,相当于每个时钟周期,每个模块都在并行工作,可以极大提升运行效率。
[0115]
此外,fpga可以利用片内sram(static random-access memory,静态随机存取存储器),维护输出缓存队列和参考缓存队列,并不断将两者互换更新,当点积计算完成时,排序过程也基本上完成。而且,在本公开实施例中,top k排序的实现不占用额外的外存带宽。
[0116]
可以理解的是,上述图5~图6是以k=8为例,示出了排序模块完成top 8排序的示意图,在实际应用场景中,k可能为更大的值,为设计方便,可以取一些典型值,如1024。当k被设置为1024时,则fpga芯片中,将会产生共11个比较器模块。
[0117]
进一步的,采用上述技术方案,在点积计算模块与排序模块之间存在吞吐差问题,假设每个点积计算模块读取一个候选向量需要8个时钟周期,也就是说,32个点积计算模块在每8个时钟周期产生32个点积数据,平均每个时钟周期产生4个点积数据,然而排序模块每个时钟周期只会消耗一个点积数据,因此,存在两个模块间的吞吐差。针对此问题,本公开实施例提出设置过滤模块,通过过滤模块可以过滤一部分点积数据,使得点积计算模块与排序模块间的吞吐差问题得到缓解。
[0118]
可选的,图7示出了本公开实施例提供的fpga芯片的又一示意图,如图7所示,该fpga芯片还包括:m个过滤模块140,和多路选择器150。每个过滤模块140与一点积计算模块120对应。其中,在每个点积计算模块120与对应的过滤模块140之间设有第一缓存队列,共有m个第一缓存队列,在每个过滤模块140与多路选择器150之间设有第二缓存队列,共有m个第二缓存队列。
[0119]
逻辑处理模块132还用于,每当第s 1个比较器模块完成一轮排序后,在将当前的输出缓存队列切换为新的参考缓存队列之前,将当前的输出缓存队列中位于队尾的最小点积数据分别输出给每个过滤模块140。
[0120]
每个点积计算模块120用于,在计算候选向量与预设向量的点积,得到对应的点积数据后,将点积数据写入到对应的第一缓存队列中。
[0121]
每个过滤模块140用于,在每个时钟周期从对应的第一缓存队列中读取一个点积数据,并比较该点积数据和最小点积数据,在该点积数据大于最小点积数据时,将该点积数据写入到对应的第二缓存队列中。
[0122]
多路选择器150用于,在每个时钟周期从多个第二缓存队列中读取一个点积数据,并将读取的点积数据输出到排序模块130,具体的,输出给排序模块130中的第1个比较器模
块。
[0123]
可以理解的,如果点积计算模块输出的点积数据不大于当前的输出缓存队列中位于队尾的最小点积数据,那么这个点积数据没有必要参与到top k排序中,所以过滤模块不将其写入到第二缓存队列,进而该点积数据不会进入到排序模块中参与排序。
[0124]
需要说明的是,在召回过程的前期,输出缓存队列中位于队尾的最小点积数据只是基于前期的多个点积数据得出的局部最小点积数据,该最小点积数据并不准确,所以过滤模块的过滤效果有限,然而随着一个又一个时钟周期过去,输入到排序模块中参与排序的点积数据越来越多,输出缓存队列中位于队尾的最小点积数据将逐渐接近全局最小点积数据,在过滤模块处将会过滤大量的点积数据,这些被过滤掉的点积数据将不会被写入到第二缓存队列,自然更不会进入到排序模块中。
[0125]
通过上述方案,即使前期点积数据会在第二缓存队列中累积,但随着多路选择器在每个时钟周期从m个第二缓存队列中选择一个点积数据,输出到排序模块中,过滤模块的过滤效果逐步增加,到后期,进入到第二缓存队列的点积数据越来越少,而第二缓存队列中的点积数据仍在正常消耗,当第二缓存队列中点积数据的增加速度小于消耗速度,第二缓存队列中的点积数据将会逐渐减少,直至最后,点积计算模块得到最后一个点积数据时,此时排序模块中的top k排序也基本上完成。从而,既解决了点积计算模块与排序模块间存在的吞吐差问题,同时,也减少了排序模块中参与排序的点积数据的数量,使得召回过程的整体速率得到提升。
[0126]
可选的,上述过滤模块的设置将会产生新的问题,即输入到排序模块的点积数据的总量n是不可预测的,在理想情况下,输入到排序模块的点积数据的总量n为k的整数倍,使得每个比较器模块都能够完整执行完每轮排序,但由于部分点积数据在过滤模块处被过滤掉,导致无法确定最终会有多少个点积数据进入到排序模块中。如果进入到排序模块的点积数据的总量n不为k的整数倍,那么可能无法在输出缓存队列中产生新一轮的k个点积数据。
[0127]
针对该问题,在本公开实施例中,每个过滤模块还用于,在从对应的第一缓存队列中读取到初始结束标志后,将初始结束标志写入到对应的第二缓存队列中。
[0128]
多路选择器还用于,在从m个第二缓存队列中读取到第m个初始结束标志时,确定已向排序模块输出的点积数据的总量n,在总量n不为k的整数倍时,在之后的每个时钟周期继续向排序模块输出一个用于补齐的点积数据,直至总量n为k的整数倍,在输出最后一个用于补齐的点积数据后,在下一个时钟周期,向排序模块输出一个最终结束标志。其中,n为正整数。
[0129]
在排序模块中,前s个比较器模块还用于,在读取到输入到该比较器模块的最终结束标志后,将最终结束标志写入到对应的两个缓存队列中的其中一个队列,并在当前轮次的排序完成后,向下一个比较器模块输出该最终结束标志。
[0130]
第s 1个比较器模块用于,在读取到输入到该比较器模块的最终结束标志后,在当前轮次的排序完成后,输出包括输出缓存队列中k个点积数据的有序数组。即第s 1个比较器模块是在最终结束标志的指示下输出有序数组,结束召回任务。
[0131]
在上述方案中,一方面,每个点积计算模块在将最后一个点积数据写入到第一缓存队列以后,在下个时钟周期,会再向第一缓存队列中写入一个初始结束标志,共产生m个
初始结束标志,m个初始结束标志将通过对应的过滤模块传递到对应的第二缓存队列中,多路选择器将记录从m个第二缓存队列中读取到的初始结束标志的数量,当读取到第m个初始结束标志时,产生一个最终结束标志,这个最终结束标志将在s 1个比较器模块中一级一级传递,直至到达第s 1个比较器模块,该最终结束标志用于指示第s 1个比较器模块何时输出有序数组。当第s 1个比较器模块读取到最终结束标志时,表示最后一个点积数据已经输入到该比较器模块中,因此,在当前轮次的排序完成后,第s 1个比较器模块不用再等待下一轮排序,而是可以直接输出有序数组,从而通过初始结束标志和最终结束标志对有序数组的输出进行控制。
[0132]
另一方面,在输入到排序模块的点积数据的总量n不为k的整数倍时,主动将点积数据补齐到k的整数倍,在一些应用场景中,用于补齐的点积数据可以为无穷小或者为零,使得每个点积数据与之比较时,均大于该用于补齐的点积数据。通过主动补齐点积数据,使得最终输入到排序模块的点积数据的数量为k的整数倍,从而确保排序模块始终能够输出长度为k的有序数组。
[0133]
进一步的,每个点积数据可以为包括[点积,id]的二元组,点积为候选向量与预设向量间的点积的数值,id为该候选向量对应的唯一id,当排序模块输出包括k个点积数据的有序数组后,下一步任务(粗排序)中,可根据该有序数组中的k个id确定本次召回的k个待处理数据,进而根据本次召回的k个待处理数据进行下一步的粗排序。下一步任务可以仍然由该fpga芯片执行,或者可以由其他设备或者芯片执行,本实施例对此不作限定。
[0134]
根据前文提供的fpga芯片,本公开实施例还提供一种数据召回方法,以快速召回待处理数据,该数据召回方法应用于前文提供的fpga芯片。该fpga芯片包括多个存储模块、多个点积计算模块以及排序模块,每个存储模块中分别存储多个候选向量,且每个候选向量对应一个待处理数据。
[0135]
图8示出了本公开实施例提供的数据召回方法的一种流程图,请参照图8,该方法包括:
[0136]
s210,在每p个时钟周期,多个点积计算模块并行从对应的存储模块中读取候选向量,计算候选向量与预设向量的点积,得到对应的点积数据。
[0137]
其中,p是根据读取一个候选向量需要消耗的时间确定的,p为正整数。
[0138]
其中,多个存储模块、多个点积计算模块和多个过滤模块的数量均为m,即该fpga芯片包括m个存储模块和m个点积计算模块。假设共有q个候选向量,共代表q个待处理数据,该方法还包括:按照m个存储模块之间的预设顺序,依次将m个候选向量存储到对应的存储模块中,并循环上述过程,直至q个候选向量均被存储;其中,同一存储模块存储的各候选向量中,相邻候选向量之间的存储地址连续。通过以上步骤完成将q个候选向量顺序存储在m个存储模块中。当有新的候选向量加入时,将新加入的候选向量按照该预设顺序,继续在m个存储模块中依次存储,并以此循环。
[0139]
因此,步骤s210包括:在每p个时钟周期,每个点积计算模块根据连续的存储地址从对应的存储模块中顺序读取该存储模块中存储的一个候选向量。
[0140]
可以理解的,当点积计算模块能够在一个时钟周期内读完一个候选向量时,p=1,每个点积计算模块将在每个时钟周期从对应的存储模块中读取一个候选向量。当候选向量的大小不足以使得点积计算模块在一个时钟周期内读完一个候选向量时,点积计算模块在
下一个时钟周期仍然在读取上一个时钟周期未读取完的候选向量,直至该候选向量读取完毕。因此,每个点积计算模块每p个时钟周期读取一个候选向量。
[0141]
s220,在每个时钟周期,排序模块读取点积数据,并根据读取的点积数据进行排序操作,在经过多个时钟周期后,输出相应的有序数组。
[0142]
其中,有序数组包括降序排列的多个点积数据,且该有序数组中每个点积数据对应一个被召回的待处理数据。
[0143]
在上述方案中,点积计算过程与排序过程可以完全流水式地执行起来,点积计算模块每p个时钟周期算完一个点积数据后,这个点积数据将会传递给排序模块进行排序,同时,点积计算模块将会继续从存储模块中读取候选向量并计算新的点积数据,相当于每个时钟周期,每个模块都在并行工作,当点积计算完成时,排序过程也基本上完成,可以极大提升召回效率,而且,排序的实现不占用额外的外存带宽。此外,通常情况下,fpga芯片内可集成高带宽内存,内存带宽将远高于cpu的内存带宽,从而解决cpu内存带宽对候选向量遍历速率的限制,可以降低候选向量集的遍历时间。
[0144]
可选的,排序模块包括依次连接的s 1个比较器模块,且每个比较器模块并行工作。其中,步骤s220包括:
[0145]
在每至少2i个时钟周期,第i个比较器模块对连续输入到该比较器模块的2i个点积数据进行一轮排序,以有序向下一个比较器模块输出2i个点积数据;其中,i为整数,且1≤i≤s;
[0146]
在每至少k个时钟周期,第s 1个比较器模块将连续输入到该比较器模块的2s个(k个)点积数据与当前的参考缓存队列中的k个点积数据进行一轮排序,以有序向当前的输出缓存队列中写入排在前列的k个点积数据,其中,k=2s;
[0147]
在完成对所有点积数据的排序后,第s 1个比较器模块输出包含排序完成时输出缓存队列中的k个点积数据的有序数组。
[0148]
其中,参考缓存队列用于存储第s 1个比较器模块前一轮排序得到的排在前列的k个点积数据,输出缓存队列用于存储第s 1个比较器模块本轮排序得到的排在前列的k个点积数据。
[0149]
在一示例性实施例中,在前s个比较器模块中,每个比较器模块各对应两个缓存队列。在上述步骤中,在每至少2i个时钟周期,第i个比较器模块对连续输入到该比较器模块的2i个点积数据进行一轮排序,以有序向下一个比较器模块输出2i个点积数据的步骤,包括:
[0150]
在每个时钟周期,第i个比较器模块读取输入到该比较器模块的一个点积数据,并将该点积数据写入到对应的两个缓存队列中的相应队列;其中,每连续输入的2
i-1
个点积数据被写入到同一个队列中;
[0151]
在每个时钟周期,第i个比较器模块比较两个缓存队列中位于队头的两个点积数据,并向下一个比较器模块输出位于队头的两个点积数据中的较大者;
[0152]
将本轮排序的2i个点积数据作为目标点积数据,当本轮排序已输出其中一个缓存队列中的2
i-1
个目标点积数据时,第i个比较器模块在之后的每个时钟周期依次向下一个比较器模块输出一个另一缓存队列中剩余的目标点积数据,直至两个缓存队列中的共2i个目标点积数据均已输出,本轮排序完成。
[0153]
在一示例性实施例中,第s 1个比较器模块对应三个缓存队列,分别为输入缓存队列,参考缓存队列和输出缓存队列。在上述步骤中,在每至少k个时钟周期,第s 1个比较器模块将连续输入到该比较器模块的2s个点积数据与当前的参考缓存队列中的k个点积数据进行一轮排序,以有序向当前的输出缓存队列中写入排在前列的k个点积数据的步骤,包括:
[0154]
在每个时钟周期,第s 1个比较器模块读取输入到该比较器模块的一个点积数据,并将该点积数据写入到输入缓存队列中;其中,输入缓存队列在第s 1个比较器模块每完成一轮排序后被清空;
[0155]
在每个时钟周期,第s 1个比较器模块比较输入缓存队列与当前的参考缓存队列中位于队头的两个点积数据,并向当前的输出缓存队列中写入位于队头的两个点积数据中的较大者,直至本轮排序已向输出缓存队列中连续写入k个点积数据后,本轮排序完成。
[0156]
其中,参考缓存队列和输出缓存队列可能是变化的,参考缓存队列和输出缓存队列间可以相互切换。排序模块还包括逻辑处理模块。该方法还包括:每当第s 1个比较器模块完成一轮排序后,逻辑处理模块将输入缓存队列和当前的参考缓存队列中剩余的点积数据清空,然后将当前的输出缓存队列切换为新的参考缓存队列,将当前的参考缓存队列切换为新的输出缓存队列。
[0157]
在上述方案中,利用逻辑处理模块和依次连接的s 1个比较器模块,可实现top k排序,即从点积计算模块计算出的所有点积数据中得到排在前列的k个点积数据,并通过有序数组输出该排在前列的k个点积数据。需要说明的是,fpga具备可编程特性,即可通过程序指定fpga实现某一特定数字电路,因此可通过编程设置排序模块中比较器模块的数量,从而实现不同k值的排序。
[0158]
在可选的实施例中,fpga芯片还包括多路选择器以及多个过滤模块,在每个点积计算模块与对应的过滤模块之间设有第一缓存队列,在每个过滤模块与多路选择器之间设有第二缓存队列。
[0159]
基于该实施例,图9示出了本公开实施例提供的数据召回方法的又一流程图,请参照图9,该方法还包括:
[0160]
s310,每当第s 1个比较器模块完成一轮排序后,在将当前的输出缓存队列切换为新的参考缓存队列之前,逻辑处理模块将当前的输出缓存队列中位于队尾的最小点积数据分别输出给每个过滤模块。
[0161]
s320,在计算候选向量与预设向量的点积,得到对应的点积数据后,点积计算模块将该点积数据写入到对应的第一缓存队列中。
[0162]
s330,在每个时钟周期,过滤模块从对应的第一缓存队列中读取一个点积数据,并比较该点积数据和最小点积数据,在该点积数据大于最小点积数据时,将该点积数据写入到对应的第二缓存队列中。
[0163]
s340,在每个时钟周期,多路选择器从多个第二缓存队列中读取一个点积数据,并将读取的点积数据输出到排序模块。
[0164]
在上述方案中,设置过滤模块,每当第s 1个比较器模块完成一轮排序时,逻辑处理模块向每个过滤模块输出一个最小点积数据,随着时钟周期的逐步累加,在过滤模块处将会过滤大量的点积数据,这些被过滤掉的点积数据将不会被写入到第二缓存队列,自然
更不会进入到排序模块中,从而,缓解点积计算模块与排序模块间的吞吐差问题,同时,减少了排序模块中参与排序的点积数据的数量,使得召回过程的整体速率得到提升。
[0165]
在可选的实施例中,图10示出了本公开实施例提供的数据召回方法的又一流程图。请参照图10,该方法还包括:
[0166]
s410,每个点积计算模块在从对应的存储模块中读取到该存储模块中存储的最后一个候选向量后,且在将最后一个候选向量对应的最后一个点积数据写入到对应的第一缓存队列后,等待下一个时钟周期,并在下一个时钟周期,向对应的第一缓存队列写入一个初始结束标志。
[0167]
s420,每个过滤模块在从对应的第一缓存队列中读取到初始结束标志后,将初始结束标志写入到对应的第二缓存队列中。
[0168]
s430,多路选择器在从m个第二缓存队列中读取到第m个初始结束标志时,确定已向排序模块输出的点积数据的总量n,在该总量n不为k的整数倍时,在之后的每个时钟周期继续向排序模块输出一个用于补齐的点积数据,直至该总量n为k的整数倍,在输出最后一个用于补齐的点积数据后,等待下一个时钟周期,并在下一个时钟周期,向排序模块输出一个最终结束标志。
[0169]
s440,排序模块的第i个比较器模块,在读取到输入到该比较器模块的最终结束标志后,将最终结束标志写入到对应的两个缓存队列中的其中一个队列,并在当前轮次的排序完成后,向下一个比较器模块输出该最终结束标志。
[0170]
其中,在步骤s220中,在完成对所有点积数据的排序后,第s 1个比较器模块输出包含排序完成时输出缓存队列中的k个点积数据的有序数组的,包括:第s 1个比较器模块在读取到输入到该比较器模块的最终结束标志后,在当前轮次的排序完成后,输出包括输出缓存队列中k个点积数据的有序数组。
[0171]
在上述方案中,多路选择器通过初始结束标志确定是否产生一个最终结束标志,在产生最终结束标志后,将最终结束标志输出给排序模块,最终结束标志将在排序模块的s 1个比较器模块中一级一级传递,直至到达第s 1个比较器模块,并用于指示第s 1个比较器模块何时输出有序数组,从而对有序数组的输出进行控制。同时,通过主动补齐点积数据,使得最终输入到排序模块的点积数据的数量为k的整数倍,确保排序模块始终能够输出长度为k的有序数组。
[0172]
可以理解的是,关于本公开实施例提供的数据召回方法,其具体实施方式和技术效果已在有关fpga芯片的实施例中进行了详细描述,此处将不做详细阐述说明,未提及的其他内容请参照fpga芯片的相关说明。
[0173]
需要说明的是,附图中的流程图和框图,图示了按照本公开各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,该模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。例如,每个点积计算模块、每个过滤模块、多路选择器和每个比较器模块可以根据时钟周期并行地执行附图中的步骤。
[0174]
根据本公开的一个或多个实施例,示例1提供了一种用于数据召回的fpga芯片,包括:
[0175]
多个存储模块,用于存储多个候选向量,每个候选向量对应一个待处理数据;
[0176]
多个点积计算模块,用于在每p个时钟周期,并行从对应的存储模块中读取候选向量,计算所述候选向量与预设向量的点积,得到对应的点积数据,其中p是根据读取一个所述候选向量需要消耗的时间确定的,p为正整数;
[0177]
排序模块,用于在每个时钟周期读取所述点积数据,并根据读取的所述点积数据进行排序操作,在经过多个时钟周期后,输出相应的有序数组,所述有序数组包括降序排列的多个点积数据,且所述有序数组中每个点积数据对应一个被召回的待处理数据。
[0178]
根据本公开的一个或多个实施例,示例2提供了示例1的fpga芯片,所述排序模块包括依次连接的s 1个比较器模块,s为正整数;
[0179]
第i个比较器模块用于,在每至少2i个时钟周期,对连续输入到该比较器模块的2i个点积数据进行一轮排序,以有序向下一个比较器模块输出所述2i个点积数据,i为整数,且1≤i≤s;
[0180]
第s 1个比较器模块用于,在每至少k个时钟周期,将连续输入到该比较器模块的2s个点积数据与当前的参考缓存队列中的k个点积数据进行一轮排序,以有序向当前的输出缓存队列中写入排在前列的k个点积数据,k=2s;
[0181]
第s 1个比较器模块还用于,在完成对所有点积数据的排序后,输出包含排序完成时输出缓存队列中的k个点积数据的有序数组;
[0182]
其中,所述参考缓存队列用于存储所述第s 1个比较器模块前一轮排序得到的排在前列的k个点积数据,所述输出缓存队列用于存储所述第s 1个比较器模块本轮排序得到的排在前列的k个点积数据。
[0183]
根据本公开的一个或多个实施例,示例3提供了示例2的fpga芯片,在前s个比较器模块中,每个比较器模块各对应两个缓存队列;所述第i个比较器模块用于通过如下方式对连续输入的2i个点积数据进行一轮排序:
[0184]
在每个时钟周期读取输入到该比较器模块的一个点积数据,并将所述点积数据写入到对应的两个缓存队列中的相应队列;其中,每连续输入的2
i-1
个点积数据被写入到同一个队列中;
[0185]
在每个时钟周期比较所述两个缓存队列中位于队头的两个点积数据,并向下一个比较器模块输出位于队头的两个点积数据中的较大者;
[0186]
将本轮排序的2i个点积数据作为目标点积数据,当本轮排序已输出其中一个缓存队列中的2
i-1
个目标点积数据时,在之后的每个时钟周期依次向下一个比较器模块输出一个另一缓存队列中剩余的目标点积数据,直至所述两个缓存队列中的共2i个目标点积数据均已输出,本轮排序完成。
[0187]
根据本公开的一个或多个实施例,示例4提供了示例3的fpga芯片,所述第s 1个比较器模块用于通过如下方式将连续输入的2s个点积数据与当前的参考缓存队列中的k个点积数据进行一轮排序:
[0188]
在每个时钟周期读取输入到该比较器模块的一个点积数据,并将所述点积数据写入到输入缓存队列中;其中,所述输入缓存队列在所述第s 1个比较器模块每完成一轮排序
后被清空;
[0189]
在每个时钟周期比较所述输入缓存队列与当前的参考缓存队列中位于队头的两个点积数据,并向当前的输出缓存队列中写入位于队头的两个点积数据中的较大者,直至本轮排序已向所述输出缓存队列中连续写入k个点积数据后,本轮排序完成。
[0190]
根据本公开的一个或多个实施例,示例5提供了示例4的fpga芯片,所述排序模块还包括逻辑处理模块;
[0191]
所述逻辑处理模块用于,每当所述第s 1个比较器模块完成一轮排序后,将所述输入缓存队列和当前的参考缓存队列中剩余的点积数据清空,然后将当前的输出缓存队列切换为新的参考缓存队列,将当前的参考缓存队列切换为新的输出缓存队列。
[0192]
根据本公开的一个或多个实施例,示例6提供了示例5的fpga芯片,所述fpga芯片还包括多路选择器以及多个过滤模块,在每个所述点积计算模块与对应的所述过滤模块之间设有第一缓存队列,在每个所述过滤模块与所述多路选择器之间设有第二缓存队列;
[0193]
所述逻辑处理模块还用于,每当所述第s 1个比较器模块完成一轮排序后,在将当前的输出缓存队列切换为新的参考缓存队列之前,将当前的输出缓存队列中位于队尾的最小点积数据分别输出给每个所述过滤模块;
[0194]
每个所述点积计算模块用于,在计算所述候选向量与预设向量的点积,得到对应的点积数据后,将所述点积数据写入到对应的第一缓存队列中;
[0195]
每个所述过滤模块用于,在每个时钟周期从对应的第一缓存队列中读取一个点积数据,并比较所述点积数据和所述最小点积数据,在所述点积数据大于所述最小点积数据时,将所述点积数据写入到对应的第二缓存队列中;
[0196]
所述多路选择器用于,在每个时钟周期从多个第二缓存队列中读取一个点积数据,并将读取的所述点积数据输出到所述排序模块。
[0197]
根据本公开的一个或多个实施例,示例7提供了示例6的fpga芯片,所述多个存储模块、所述多个点积计算模块和所述多个过滤模块的数量均为m,m为正整数;
[0198]
每个所述点积计算模块还用于,在从对应的所述存储模块中读取到该存储模块中存储的最后一个候选向量后,且在将所述最后一个候选向量对应的最后一个点积数据写入到对应的第一缓存队列后,在下一个时钟周期,向对应的所述第一缓存队列写入一个初始结束标志;
[0199]
每个所述过滤模块还用于,在从对应的所述第一缓存队列中读取到所述初始结束标志后,将所述初始结束标志写入到对应的所述第二缓存队列中;
[0200]
所述多路选择器还用于,在从m个第二缓存队列中读取到第m个初始结束标志时,确定已向所述排序模块输出的点积数据的总量n,在所述总量n不为k的整数倍时,在之后的每个时钟周期继续向所述排序模块输出一个用于补齐的点积数据,直至所述总量n为k的整数倍,在输出最后一个用于补齐的点积数据后,在下一个时钟周期,向所述排序模块输出一个最终结束标志,n为正整数;
[0201]
在所述排序模块中,所述第i个比较器模块还用于,在读取到输入到该比较器模块的最终结束标志后,将所述最终结束标志写入到对应的两个缓存队列中的其中一个队列,并在当前轮次的排序完成后,向下一个比较器模块输出所述最终结束标志;
[0202]
所述第s 1个比较器模块用于,在读取到输入到该比较器模块的最终结束标志后,
在当前轮次的排序完成后,输出包括所述输出缓存队列中k个点积数据的所述有序数组。
[0203]
根据本公开的一个或多个实施例,示例8提供了示例1-7中任一示例的fpga芯片,所述多个存储模块的数量为m,m为正整数;其中,所述多个候选向量是通过如下方式存储在m个存储模块中:
[0204]
按照m个存储模块之间的预设顺序,依次将m个候选向量存储到对应的存储模块中,并循环上述过程,直至所述多个候选向量均被存储;其中,同一存储模块存储的各候选向量中,相邻候选向量之间的存储地址连续;
[0205]
其中,每个所述点积计算模块用于,在每p个时钟周期,根据连续的存储地址从对应的存储模块中顺序读取该存储模块中存储的一个候选向量。
[0206]
根据本公开的一个或多个实施例,示例9提供了一种数据召回方法,应用于fpga芯片,所述fpga芯片包括多个存储模块、多个点积计算模块以及排序模块,每个存储模块中分别存储多个候选向量,且每个候选向量对应一个待处理数据;所述方法包括:
[0207]
在每p个时钟周期,所述多个点积计算模块并行从对应的存储模块中读取候选向量,计算所述候选向量与预设向量的点积,得到对应的点积数据,其中p是根据读取一个所述候选向量需要消耗的时间确定的,p为正整数;
[0208]
在每个时钟周期,所述排序模块读取所述点积数据,并根据读取的所述点积数据进行排序操作,在经过多个时钟周期后,输出相应的有序数组,所述有序数组包括降序排列的多个点积数据,且所述有序数组中每个点积数据对应一个被召回的待处理数据。
[0209]
根据本公开的一个或多个实施例,示例10提供了示例9的方法,所述排序模块包括依次连接的s 1个比较器模块,且每个比较器模块并行工作,s为正整数;所述排序模块读取所述点积数据,并根据读取的所述点积数据进行排序操作,在经过多个时钟周期后,输出相应的有序数组,包括:
[0210]
在每至少2i个时钟周期,第i个比较器模块对连续输入到该比较器模块的2i个点积数据进行一轮排序,以有序向下一个比较器模块输出所述2i个点积数据,i为整数,且1≤i≤s;
[0211]
在每至少k个时钟周期,第s 1个比较器模块将连续输入到该比较器模块的2s个点积数据与当前的参考缓存队列中的k个点积数据进行一轮排序,以有序向当前的输出缓存队列中写入排在前列的k个点积数据,k=2s;
[0212]
在完成对所有点积数据的排序后,第s 1个比较器模块输出包含排序完成时输出缓存队列中的k个点积数据的有序数组;
[0213]
其中,所述参考缓存队列用于存储所述第s 1个比较器模块前一轮排序得到的排在前列的k个点积数据,所述输出缓存队列用于存储所述第s 1个比较器模块本轮排序得到的排在前列的k个点积数据。
[0214]
根据本公开的一个或多个实施例,示例11提供了示例10的方法,在前s个比较器模块中,每个比较器模块各对应两个缓存队列;所述在每至少2i个时钟周期,第i个比较器模块对连续输入到该比较器模块的2i个点积数据进行一轮排序,以有序向下一个比较器模块输出所述2i个点积数据,包括:
[0215]
在每个时钟周期,第i个比较器模块读取输入到该比较器模块的一个点积数据,并将所述点积数据写入到对应的两个缓存队列中的相应队列;其中,每连续输入的2
i-1
个点积
数据被写入到同一个队列中;
[0216]
在每个时钟周期,第i个比较器模块比较所述两个缓存队列中位于队头的两个点积数据,并向下一个比较器模块输出位于队头的两个点积数据中的较大者;
[0217]
将本轮排序的2i个点积数据作为目标点积数据,当本轮排序已输出其中一个缓存队列中的2
i-1
个目标点积数据时,第i个比较器模块在之后的每个时钟周期依次向下一个比较器模块输出一个另一缓存队列中剩余的目标点积数据,直至所述两个缓存队列中的共2i个目标点积数据均已输出,本轮排序完成。
[0218]
根据本公开的一个或多个实施例,示例12提供了示例11的方法,所述在每至少k个时钟周期,第s 1个比较器模块将连续输入到该比较器模块的2s个点积数据与当前的参考缓存队列中的k个点积数据进行一轮排序,以有序向当前的输出缓存队列中写入排在前列的k个点积数据,包括:
[0219]
在每个时钟周期,第s 1个比较器模块读取输入到该比较器模块的一个点积数据,并将所述点积数据写入到输入缓存队列中;其中,所述输入缓存队列在所述第s 1个比较器模块每完成一轮排序后被清空;
[0220]
在每个时钟周期,第s 1个比较器模块比较所述输入缓存队列与当前的参考缓存队列中位于队头的两个点积数据,并向当前的输出缓存队列中写入位于队头的两个点积数据中的较大者,直至本轮排序已向所述输出缓存队列中连续写入k个点积数据后,本轮排序完成。
[0221]
根据本公开的一个或多个实施例,示例13提供了示例12的方法,所述排序模块还包括逻辑处理模块;所述方法还包括:
[0222]
每当所述第s 1个比较器模块完成一轮排序后,所述逻辑处理模块将所述输入缓存队列和当前的参考缓存队列中剩余的点积数据清空,然后将当前的输出缓存队列切换为新的参考缓存队列,将当前的参考缓存队列切换为新的输出缓存队列。
[0223]
根据本公开的一个或多个实施例,示例14提供了示例13的方法,所述fpga芯片还包括多路选择器以及多个过滤模块,在每个所述点积计算模块与对应的所述过滤模块之间设有第一缓存队列,在每个所述过滤模块与所述多路选择器之间设有第二缓存队列;所述方法还包括:
[0224]
每当所述第s 1个比较器模块完成一轮排序后,在将当前的输出缓存队列切换为新的参考缓存队列之前,所述逻辑处理模块将当前的输出缓存队列中位于队尾的最小点积数据分别输出给每个所述过滤模块;
[0225]
在计算所述候选向量与预设向量的点积,得到对应的点积数据后,所述点积计算模块将所述点积数据写入到对应的第一缓存队列中;
[0226]
在每个时钟周期,每个所述过滤模块从对应的第一缓存队列中读取一个点积数据,并比较所述点积数据和所述最小点积数据,在所述点积数据大于所述最小点积数据时,将所述点积数据写入到对应的第二缓存队列中;
[0227]
在每个时钟周期,所述多路选择器从多个第二缓存队列中读取一个点积数据,并将读取的所述点积数据输出到所述排序模块。
[0228]
根据本公开的一个或多个实施例,示例15提供了示例14的方法,所述多个存储模块、所述多个点积计算模块和所述多个过滤模块的数量均为m,m为正整数;所述方法还包
括:
[0229]
每个所述点积计算模块在从对应的所述存储模块中读取到该存储模块中存储的最后一个候选向量后,且在将所述最后一个候选向量对应的最后一个点积数据写入到对应的第一缓存队列后,等待下一个时钟周期,并在下一个时钟周期,向对应的所述第一缓存队列写入一个初始结束标志;
[0230]
每个所述过滤模块在从对应的所述第一缓存队列中读取到所述初始结束标志后,将所述初始结束标志写入到对应的所述第二缓存队列中;
[0231]
所述多路选择器在从m个第二缓存队列中读取到第m个初始结束标志时,确定已向所述排序模块输出的点积数据的总量n,在所述总量n不为k的整数倍时,在之后的每个时钟周期继续向所述排序模块输出一个用于补齐的点积数据,直至所述总量n为k的整数倍,在输出最后一个用于补齐的点积数据后,等待下一个时钟周期,并在下一个时钟周期,向所述排序模块输出一个最终结束标志,n为正整数;
[0232]
所述排序模块的第i个比较器模块,在读取到输入到该比较器模块的最终结束标志后,将所述最终结束标志写入到对应的两个缓存队列中的其中一个队列,并在当前轮次的排序完成后,向下一个比较器模块输出所述最终结束标志;
[0233]
所述在完成对所有点积数据的排序后,第s 1个比较器模块输出包含排序完成时输出缓存队列中的k个点积数据的有序数组,包括:
[0234]
所述第s 1个比较器模块在读取到输入到该比较器模块的最终结束标志后,在当前轮次的排序完成后,输出包括所述输出缓存队列中k个点积数据的有序数组。
[0235]
根据本公开的一个或多个实施例,示例16提供了示例9-15中任一示例的方法,所述多个存储模块的数量为m,m为正整数;所述方法还包括:
[0236]
按照m个存储模块之间的预设顺序,依次将m个候选向量存储到对应的存储模块中,并循环上述过程,直至所述多个候选向量均被存储;其中,同一存储模块存储的各候选向量中,相邻候选向量之间的存储地址连续;
[0237]
所述在每p个时钟周期,所述多个点积计算模块并行从对应的存储模块中读取候选向量,包括:
[0238]
在每p个时钟周期,每个所述点积计算模块根据连续的存储地址从对应的存储模块中顺序读取该存储模块中存储的一个候选向量。
[0239]
以上描述仅为本公开的较佳实施例以及对所运用技术原理的说明。本领域技术人员应当理解,本公开中所涉及的公开范围,并不限于上述技术特征的特定组合而成的技术方案,同时也应涵盖在不脱离上述公开构思的情况下,由上述技术特征或其等同特征进行任意组合而形成的其它技术方案。例如上述特征与本公开中公开的(但不限于)具有类似功能的技术特征进行互相替换而形成的技术方案。
[0240]
此外,虽然采用特定次序描绘了各操作,但是这不应当理解为要求这些操作以所示出的特定次序或以顺序次序执行来执行。在一定环境下,多任务和并行处理可能是有利的。同样地,虽然在上面论述中包含了若干具体实现细节,但是这些不应当被解释为对本公开的范围的限制。在单独的实施例的上下文中描述的某些特征还可以组合地实现在单个实施例中。相反地,在单个实施例的上下文中描述的各种特征也可以单独地或以任何合适的子组合的方式实现在多个实施例中。
[0241]
尽管已经采用特定于结构特征和/或方法逻辑动作的语言描述了本主题,但是应当理解所附权利要求书中所限定的主题未必局限于上面描述的特定特征或动作。相反,上面所描述的特定特征和动作仅仅是实现权利要求书的示例形式。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献