LSL)或OpenGL著色器語(yǔ)言(GLSL)。應(yīng)用還包括以適合于由通用處理器核1034來(lái)執(zhí)行的機(jī)器語(yǔ)言的可執(zhí)行指令1014。應(yīng)用還包括由頂點(diǎn)數(shù)據(jù)定義的圖形對(duì)象1016。
[0084]在一些實(shí)施例中,操作系統(tǒng)1020是來(lái)自Microsoft公司的Microsoft ? Windows?操作系統(tǒng)、專有的類UNIX操作系統(tǒng)、或使用Linux內(nèi)核的變型的開放源類UNIX操作系統(tǒng)。當(dāng)Direct3D API在使用中時(shí),操作系統(tǒng)1020使用前端著色器編譯器1024來(lái)將以HLSL的任何著色器指令1012編譯成較低級(jí)著色器語(yǔ)言。編譯可以是即時(shí)(JIT)編譯或者應(yīng)用可以執(zhí)行著色器預(yù)編譯。在一些實(shí)施例中,高級(jí)著色器在3D圖形應(yīng)用1010的編譯期間被編譯成低級(jí)著色器。
[0085]在一些實(shí)施例中,用戶模式圖形驅(qū)動(dòng)器1026包含后端著色器編譯器1027以將著色器指令1012轉(zhuǎn)換成硬件特定的表示。當(dāng)OpenGL API在使用中時(shí),以GLSL高級(jí)語(yǔ)言的著色器指令1012被傳遞到用戶模式圖形驅(qū)動(dòng)器1026以供編譯。在一些實(shí)施例中,用戶模式圖形驅(qū)動(dòng)器1026使用操作系統(tǒng)內(nèi)核模式功能1028以與內(nèi)核模式圖形驅(qū)動(dòng)器1029通信。在一些實(shí)施例中,內(nèi)核模式圖形驅(qū)動(dòng)器1029與圖形處理器1032通信以分派命令和指令。
[0086]以下描述的本發(fā)明的一個(gè)實(shí)施例提供執(zhí)行多重隨機(jī)化始隹(RKD)樹構(gòu)建和搜索操作的新方法。特別地,一個(gè)實(shí)施例高效地利用圖形處理器單元(GPU)的處理資源以在高維空間中實(shí)現(xiàn)RKD樹構(gòu)建和搜索算法。這些實(shí)施例相對(duì)于當(dāng)前的基于多重RKD樹的技術(shù)而顯著地改進(jìn)構(gòu)建和搜索過(guò)程的性能。
[0087]最近鄰多重RKD樹算法包括兩個(gè)部分:(1)用于多重樹(multiple tree)的樹構(gòu)建和(2)樹搜索。樹構(gòu)建過(guò)程可以執(zhí)行一次并且所構(gòu)建的樹可以被再用于多個(gè)搜索(或者每次,這取決于它被使用在其中的應(yīng)用的類型)。
[0088]樹構(gòu)建過(guò)程在每個(gè)樹節(jié)點(diǎn)處在從具有最高方差的最先N個(gè)候選中隨機(jī)選擇的維度上來(lái)將數(shù)據(jù)對(duì)半分割(split)直到達(dá)到單個(gè)點(diǎn)(葉節(jié)點(diǎn))。隨機(jī)化的KD樹搜索算法可以被劃分成兩個(gè)階段。在第一階段處,搜索向下通過(guò)樹直到葉節(jié)點(diǎn)為止并且標(biāo)識(shí)包含了查詢點(diǎn)的格室。然而,第一候選不一定是最近鄰。圖11圖示了標(biāo)準(zhǔn)RKD樹構(gòu)建結(jié)果和示例性的搜索。黑點(diǎn)表示葉節(jié)點(diǎn)中的數(shù)據(jù)集合點(diǎn)。每個(gè)格室對(duì)應(yīng)于葉節(jié)點(diǎn)。線對(duì)應(yīng)于每個(gè)節(jié)點(diǎn)處的數(shù)據(jù)分割,其中相同格式化的線對(duì)應(yīng)于相同的樹層級(jí)。雖然顏色通常被用于標(biāo)識(shí)樹層級(jí),但是具有不同格式化的線在此處被用于避免在本專利申請(qǐng)的情況下提交彩色圖的需要。三角形1101對(duì)應(yīng)于查詢點(diǎn)(例如,針對(duì)對(duì)照數(shù)據(jù)集而執(zhí)行的查詢)并且箭頭指向其最近鄰1102。
[0089]如圖11中所圖示的,最近鄰1102不與查詢點(diǎn)1101在相同的格室中。在搜索階段,算法“回溯”通過(guò)樹以便找到真實(shí)的最近鄰。在回溯階段,樹的整個(gè)分支可以被修剪并且當(dāng)所有未經(jīng)探索的分支已經(jīng)被修剪時(shí)搜索終止。樹回溯是總體過(guò)程的非常耗時(shí)的部分,特別是當(dāng)在當(dāng)前硬件上實(shí)現(xiàn)時(shí)。
[0090]用于執(zhí)行近似最近鄰搜索的下述技術(shù)可以以軟件、固件和/或硬件來(lái)實(shí)現(xiàn)而仍遵守本發(fā)明的底層原理。圖12A圖示了其中以由圖形處理單元1212所執(zhí)行的軟件來(lái)實(shí)現(xiàn)近似最近鄰搜索邏輯1201的一個(gè)特定實(shí)施例。在示例中,ANN搜索邏輯1201被應(yīng)用1215使用,所述應(yīng)用1215可以是例如用于執(zhí)行模式識(shí)別(例如面部識(shí)別認(rèn)證器)、數(shù)據(jù)挖掘(例如執(zhí)行模糊數(shù)據(jù)匹配)、在多媒體數(shù)據(jù)中搜索的應(yīng)用,和/或本文所述技術(shù)對(duì)其可能有用的任何其它應(yīng)用。GPU 1212包括多個(gè)執(zhí)行單元1203-1210以用于并行地處理ANN搜索的部分(如以下詳細(xì)描述的那樣)。線程分派邏輯1202向并行的執(zhí)行單元1203-1210中的每一個(gè)分派用于執(zhí)行ANN搜索的線程。
[0091]在一個(gè)實(shí)施例中,可以在由操作系統(tǒng)所提供的用戶環(huán)境內(nèi)執(zhí)行應(yīng)用1215,并且可以在由操作系統(tǒng)所使用的圖形驅(qū)動(dòng)器內(nèi)實(shí)現(xiàn)近似最近鄰搜索邏輯1201。在該實(shí)施例中,應(yīng)用1215和/或0S可以向由驅(qū)動(dòng)器/0S (未示出)所展露的應(yīng)用編程接口(API)進(jìn)行函數(shù)調(diào)用,所述應(yīng)用編程接口然后在圖形處理單元1212上調(diào)取所述函數(shù)調(diào)用。在一些實(shí)施例中,可以存在由應(yīng)用、os和驅(qū)動(dòng)器所調(diào)取的函數(shù)調(diào)用的多層。例如,在一個(gè)實(shí)施例中,可以在主機(jī)OS的頂部的訪客OS內(nèi)(例如在由主機(jī)OS所提供的虛擬化的環(huán)境中)執(zhí)行應(yīng)用1215,其中主機(jī)OS包括用于對(duì)訪客OS上運(yùn)行的應(yīng)用所進(jìn)行的程序調(diào)用進(jìn)行轉(zhuǎn)化的仿真器。當(dāng)然,本發(fā)明的底層原理不限于任何特定的基于軟件的實(shí)現(xiàn)方式。
[0092]如圖12B中所圖示的,在可替換的實(shí)施例中,ANN搜索邏輯1221直接被集成在GPU上,作為硬件和/或固件。在該實(shí)施例中,應(yīng)用1215執(zhí)行由ANN搜索邏輯1221所解碼的指令以生成由各種執(zhí)行單元1203-1210所執(zhí)行的一系列操作。例如,被特別設(shè)計(jì)成支持ANN功能的指令可以由ANN搜索邏輯1221執(zhí)行并且由應(yīng)用1215使用以執(zhí)行本文所述的ANN操作。然而,如以上所提及的,本發(fā)明的底層原理不限于用于實(shí)現(xiàn)本文所述的ANN搜索技術(shù)的任何特定方式。
[0093]現(xiàn)在轉(zhuǎn)向ANN搜索操作的細(xì)節(jié),本發(fā)明的一個(gè)實(shí)施例依賴于以下事實(shí):(1)來(lái)自第一定位的格室中的點(diǎn)是對(duì)最近鄰的良好近似;以及(2)最接近第一個(gè)所找到的格室的格室具有高概率包含真實(shí)NN。
[0094]基于這些考慮,代替于樹回溯,本發(fā)明的一個(gè)實(shí)施例將近鄰格室聯(lián)合成一個(gè),如圖13中所圖示的,并且在所選的點(diǎn)的子集中執(zhí)行強(qiáng)力NN搜索。為了簡(jiǎn)單,將在2D空間中描述本發(fā)明的實(shí)施例(盡管本領(lǐng)域技術(shù)人員將容易地領(lǐng)會(huì)到如何在3D、4D等中實(shí)現(xiàn)相同的技術(shù))。圖13示出了聯(lián)合格室的一個(gè)示例性結(jié)果。在該示例中,來(lái)自圖11的四個(gè)不同的格室(包含數(shù)據(jù)點(diǎn)1102-1106的格室)已經(jīng)被聯(lián)合以形成單個(gè)格室1303。作為格室被聯(lián)合的結(jié)果,對(duì)于查詢點(diǎn)1301的最近鄰1302落入聯(lián)合格室1303內(nèi)。
[0095]可以通過(guò)樹構(gòu)建過(guò)程中的改變而聯(lián)合格室。例如,在一個(gè)實(shí)施例中,建立點(diǎn)的閾值數(shù)目并且當(dāng)達(dá)到所指定的點(diǎn)閾值時(shí)停止構(gòu)建過(guò)程。用于傳統(tǒng)KD樹的類似的方法稱為“多桶樹”。搜索過(guò)程的一個(gè)實(shí)施例通過(guò)每個(gè)樹僅一次,到達(dá)具有多個(gè)點(diǎn)的桶并且在所有樹上的相關(guān)桶中的所有點(diǎn)上執(zhí)行強(qiáng)力NN搜索。在一個(gè)實(shí)施例中,通過(guò)使用多個(gè)執(zhí)行點(diǎn)1203-1210而并行地執(zhí)行這些操作,從而造成顯著的性能改進(jìn)。例如,在一個(gè)實(shí)施例中,線程分派邏輯1202將并行的多個(gè)點(diǎn)/樹的多個(gè)線程分派到執(zhí)行單元1203-1210中的每一個(gè)。
[0096]可以在選自不同的樹的所有桶上執(zhí)行針對(duì)NN的搜索。在一個(gè)實(shí)施例中,樹的數(shù)目等于一,并且因此其中要執(zhí)行NN搜索的桶的數(shù)目也等于一(S卩,只有一個(gè)桶被搜索)。然而,在其中使用多個(gè)樹的實(shí)施例中,可以在來(lái)自不同樹的對(duì)應(yīng)數(shù)目的不同桶內(nèi)執(zhí)行NN搜索。因此,雖然為了說(shuō)明的緣故,本文所述的本發(fā)明的一些實(shí)施例聚焦于單個(gè)桶內(nèi)的搜索,但是本發(fā)明的底層原理不限于一個(gè)桶內(nèi)的搜索(即當(dāng)使用多個(gè)樹時(shí)搜索多個(gè)桶)。
[0097]另外,在本發(fā)明的一個(gè)實(shí)施例中,為了改進(jìn)準(zhǔn)確性,實(shí)現(xiàn)新穎的模糊分割技術(shù),如圖14中所圖示的。特別地,圖14圖示了模糊桶的實(shí)現(xiàn)方式,其中較粗的線對(duì)應(yīng)于標(biāo)準(zhǔn)樹構(gòu)建并且細(xì)線對(duì)應(yīng)于模糊分割。
[0098]存在當(dāng)查詢點(diǎn)1401 (三角形)落于接近于格室邊緣處并且最近鄰1402可能沒(méi)有落在第一個(gè)所找到的格室(由綠色箭頭所指示)中的情況。因而,一個(gè)實(shí)施例,執(zhí)行模糊分割,其中邊緣點(diǎn)可以同時(shí)屬于多于一個(gè)的桶。粗實(shí)的線示出格室的標(biāo)準(zhǔn)劃分并且較輕淡(虛)的線圖示模糊桶。總而言之,本發(fā)明的一個(gè)實(shí)施例采用沒(méi)有回溯的基于多重RKD樹的ANN搜索算法,其可以在GPU (特別是具有多個(gè)執(zhí)行單元的那些)上高效執(zhí)行。另外,可以采用模糊分割以進(jìn)一步改進(jìn)性能。
[0099]通過(guò)實(shí)驗(yàn)結(jié)果,在類似水平的準(zhǔn)確性的情況下,通過(guò)現(xiàn)有實(shí)現(xiàn)方式(例如在CPU上使用用于近似最近鄰的快速庫(kù)(FLANN))已經(jīng)實(shí)現(xiàn)了多達(dá)10x時(shí)間性能改進(jìn)。在其它實(shí)現(xiàn)方式中,實(shí)現(xiàn)了準(zhǔn)確性方面的多達(dá)20%的改進(jìn)而維持時(shí)間方面的4x改進(jìn)。圖15-16中的表圖示了這些結(jié)果。
[0100]特別地,這些證明了按用于FLANN算法的NN數(shù)目并且使用本文所述的技術(shù)在兩個(gè)不同的參數(shù)集的情況下在100個(gè)查詢點(diǎn)上的平均準(zhǔn)確性。針對(duì)10NN以及對(duì)應(yīng)的時(shí)間性能圖示了平均準(zhǔn)確性。特別地,在圖15中,通過(guò)使用10K個(gè)點(diǎn)的數(shù)據(jù)集、100個(gè)點(diǎn)的查詢集以及128D浮點(diǎn)變量而示出了針對(duì)最先10個(gè)最近鄰的平均準(zhǔn)確性。在圖16中,通過(guò)使用50k個(gè)點(diǎn)的數(shù)據(jù)集、100個(gè)點(diǎn)的查詢集以及128D浮點(diǎn)變量而示出了針對(duì)最先10個(gè)最近鄰的平均準(zhǔn)確性。
[0101]如所提及的,本發(fā)明的一個(gè)實(shí)施例在樹構(gòu)建和樹搜索過(guò)程二者處采用多種技術(shù)。與標(biāo)準(zhǔn)RKD樹構(gòu)建過(guò)程相反,本發(fā)明的一個(gè)實(shí)施例中所采用的樹構(gòu)建在當(dāng)前數(shù)據(jù)子集中的點(diǎn)的數(shù)目小于或等于桶中所指定的最大點(diǎn)閾值時(shí)停止。如所提及的,圖11示出了 2D空間中標(biāo)準(zhǔn)RKD樹構(gòu)建算法的結(jié)果,其中每個(gè)桶由單個(gè)點(diǎn)表示。圖13示出了當(dāng)最大的桶大小被設(shè)置為4時(shí)RKD樹構(gòu)建的結(jié)果。在該實(shí)施例中,每個(gè)桶由2D空間中4個(gè)或更少的點(diǎn)表示。
[0102]在一個(gè)實(shí)施例中,二叉樹(binary tree)上的搜索算法被劃分成兩個(gè)階段。第一階段向下通過(guò)樹直到達(dá)到葉節(jié)點(diǎn)(桶)并且在空間中找到包含查詢點(diǎn)的格室??梢岳靡幌盗械扔跇渖疃鹊谋容^來(lái)執(zhí)行該步驟。在諸如此處所述的GPU 1212上的實(shí)現(xiàn)方式的情況中,這意味著對(duì)GPU存儲(chǔ)器的Tdept疇激。本文所述的多點(diǎn)桶方法顯著地減小樹深度,因而減少通過(guò)GPU的存儲(chǔ)器讀取并且改進(jìn)性能。
[0103]一般而言,當(dāng)搜索時(shí),來(lái)自所標(biāo)識(shí)的格室的點(diǎn)是對(duì)NN的良好近似。然而,第一候選不一定是最近鄰。圖11例如圖示了其中最近鄰不在查詢點(diǎn)格室中的情形(箭頭指向NN)。搜索的第二階段回溯通過(guò)樹以便找到真實(shí)的NN。在回溯階段,樹的整個(gè)分支可以被修剪并且當(dāng)所有未經(jīng)探索的分支已經(jīng)被修剪時(shí)搜索終止。所述過(guò)程在低維空間是有效的但是在高維空間中變得低效,其中可能存在鄰近于查詢點(diǎn)格室的更加多的格室。可以通過(guò)限制要被檢查的葉節(jié)點(diǎn)的數(shù)目并且將最佳近鄰設(shè)置為NN (如本文所述的那樣)來(lái)執(zhí)行近似NN。
[0104]存在對(duì)搜索樹進(jìn)行回溯的許多方式。最頻繁使用的方式之一稱作“優(yōu)先搜索”,其不是按樹結(jié)構(gòu)的次序來(lái)進(jìn)行的,而是基于查詢點(diǎn)的定位。特別地,按距查詢點(diǎn)的距離的次序來(lái)搜索樹節(jié)點(diǎn)。優(yōu)先搜索算法涉及計(jì)算從查詢點(diǎn)到每個(gè)格室的距離并且維護(hù)優(yōu)先隊(duì)列。優(yōu)先隊(duì)列在每個(gè)節(jié)點(diǎn)處被更新并且保存關(guān)于未采取的選項(xiàng)的信息。通過(guò)從查詢點(diǎn)到格室的距離來(lái)對(duì)優(yōu)先隊(duì)列進(jìn)行排序。在檢查了第一葉節(jié)點(diǎn)之后,優(yōu)先隊(duì)列中的頂部條目被移除并且用于遍歷最近的分支。因而,在搜索期間連續(xù)地更新優(yōu)先隊(duì)列。在一個(gè)實(shí)施例中,當(dāng)隊(duì)列為空或者已經(jīng)檢查了最大數(shù)目的葉節(jié)點(diǎn)時(shí)終止搜索。
[0105]以下技術(shù)在一個(gè)實(shí)施例中被采用以改進(jìn)在具有多個(gè)執(zhí)行單元的GPU上的性能。這些技術(shù)基于以下觀察:(1)來(lái)自第一定位的格室的點(diǎn)是對(duì)最近鄰的良好近似;以及(2)最接近第一定位的格室的格室也具有包含真實(shí)NN的高概率。
[0106]基于這些觀察,在本發(fā)明的一個(gè)實(shí)施例中,通過(guò)使用構(gòu)建過(guò)程中的改變來(lái)組合近鄰的格室(例如,如以上關(guān)于圖13所述的那樣)并且在所選點(diǎn)的子集中執(zhí)行強(qiáng)力NN搜索(而不是如在現(xiàn)有系統(tǒng)中那樣對(duì)樹進(jìn)行回溯)。這樣的方法對(duì)于主機(jī)處理器(例如CPU)上的執(zhí)行通常不是理想的,因?yàn)樗枰鄬?duì)大的桶大小和作為結(jié)果