我有一大串數字,數組中有大約150MB的數字,我需要查找連續的數字序列,序列可能是3到160個數字。所以,使其簡單,我決定了每個線程應該開始如線程ID =的CellID在CUDA中重用線程
所以thread0看着CELL0,如果在CELL0數量符合我的序列,那麼,thread0 =小區1等,如果麻木不匹配,線程停止,我爲我的20000線程。
因此,工程出來,很好,但我想知道如何重用線程,因爲我在其中尋找數字序列的數組要大得多。所以我應該把我的數組分割成更小的數組,並將它們加載到共享內存中,然後遍歷更小數組的數目並(最後填充最後一個數組)。或者我應該將大數組放在全局內存中,並讓我的線程爲ThreadID = cellID,然後ThreadID = cellID + 20000等,或者有更好的方法可以通過。
澄清:此刻,我使用20 000個線程,1個全局內存數組(150MB)中的數字和一串數字共享內存(例如:1,2,3,4,5) ,表示爲一個數組。 Thread0從Cell0開始,查看全局內存中的cell0是否等於共享內存中的cell0,如果是,則thread0將全局內存中的cell1與共享內存中的cell1進行比較,直到完全匹配。
如果兩個(全局和共享內存)單元中的數字不相等,則該線程將被簡單地丟棄。因爲全局存儲器陣列中的大部分數字都不匹配我的序列的第一個數字。我認爲使用一個線程將GM中的Cell_N匹配到ShM中的Cell_N並重疊線程是一個好主意。而且這種技術允許第一次合併內存訪問,因爲從0到19 999的每個線程都將訪問連續的內存。
但我想知道的是,「什麼是重用線程的最佳方式」已被丟棄,或完成匹配的線程。爲了能夠匹配150MB的整個數組而不是簡單匹配(20000數字+(序列長度-1))。
爲什麼不能使用通用的'ID = blockIdx.x * blockDim.x + threadIdx.x;'方法而不是將線程放入循環中? – Farzad
你的問題對我來說不是很清楚。在開始時你會說:_I需要找到連續的numbers_序列。這意味着你可以有多個可能的連續序列,例如'1,4,7,14'和'5,8,11,64'等等。稍後你會說:_ cell0中的數字匹配我的sequence_。這意味着你正在尋找一個特定的序列。你能澄清這一點嗎?在後一種情況下,似乎你正在尋找一種類似於算法的模板匹配,在這種情況下,我會指導你使用Smith-Waterman算法。 – JackOLantern
正確地制定你的問題是朝着解決方案邁出的一大步。 – JackOLantern