块读取不同长度的序列gpu

时间:2017-08-26 21:45:19

标签: parallel-processing cuda gpu nvidia gpgpu

我有一个具有不同序列长度的数组,每个序列以'>'结束。 seq = [a,b,f,g,c,d,>,b,g,d,> ....]。我计算了每个序列的长度,并将其存储在一个名为seq_length = [6,3,5,...]的不同数组中。然后,我使用独占扫描来计算偏移并将其存储在名为offset = [0,6,9,..]的数组中。

我想要的是让每个块通过使用偏移值从数组seq []中读取序列。例如,块0读取从seq [0]开始的序列,当长度为= 6时停止,块1读取从seq [6]开始的序列,当长度为= 3时停止,等等。 我怎么能在CUDA中做到这一点?我如何让每个块从不同的第i个数组条目(数组seq [])中读取。

提前谢谢你:)

1 个答案:

答案 0 :(得分:1)

CUDA有built-in variables,如threadIdx.xblockIdx.x,用于标识块中的每个线程,以及该线程所在的块。块中的每个线程都具有相同的{{ 1}}值,但块中的每个线程将具有不同的/唯一的(每块)blockIdx.x值。

因此,我们可以使用threadIdx.x为每个块选择特定序列。此变量可用于选择正确的序列长度以及每个序列/块的偏移量。

我们可以为每个序列项/字符分配一个线程。我们可以使用blockIdx.x为每个线程确定它应该选择哪个序列成员。

这是一个完整的例子:

threadIdx.x

如果你希望一个序列中有超过1024个字符,那么你可能想要修改上面的内容,也许是让每个线程处理多个字符,也许是在循环中。