在CUDA中重用线程

时间:2014-01-18 14:43:27

标签: arrays cuda nvidia

我有一大串数字,在数组中,大约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的长度))。

1 个答案:

答案 0 :(得分:1)

  

“什么是重用线程的最佳方法”已被丢弃,或者完成匹配的线程。能够匹配150MB的整个数组而不是简单匹配(20000个数字+(序列-1的长度))。

您可以以类似于规范CUDA reduction sample的方式重用线程(使用最终实现作为参考)。

int idx = threadIdx.x+blockDim.x*blockIdx.x;
while (idx < DSIZE){
  perform_sequence_matching(idx);
  idx += gridDim.x*blockDim.x;
  }

通过这种方式,在网格中有任意数量的线程,您可以覆盖任意问题大小(DSIZE);