【发布时间】:2014-02-07 22:40:51
【问题描述】:
我有一大串数字,在一个数组中,大约 150MB 的数字,我需要找到连续的数字序列,序列可能是 3 到 160 个数字。所以为了简单起见,我决定每个线程都应该启动,例如 ThreadID = CellID
所以 thread0 查看 cell0,如果 cell0 中的数字与我的序列匹配,则 thread0 = cell1 依此类推,如果 numbed 不匹配,则线程停止,我为我的 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;方法而不是将线程放入循环中? -
你的问题我不太清楚。一开始你说:我需要找到连续的数字序列。这意味着您可以有多个可能的连续序列,例如
1,4,7,14和5,8,11,64等等。稍后你说:cell0中的数字与我的序列匹配。这意味着您正在搜索特定的序列。你能澄清这一点吗?在后一种情况下,您似乎正在寻找类似算法的模板匹配,在这种情况下,我会指导您使用类似 Smith-Waterman 的算法。 -
正确地表述你的问题是朝着解决问题迈出的一大步。
-
感谢您的建议,我澄清了问题,虽然我怀疑 smith-waterman 是解决这个问题的方法,但数字的匹配非常前向,我只是想知道如何重新 -在这种特殊情况下正确使用线程。