我有一个具有不同序列长度的数组,每个序列以'>'结束。 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 [])中读取。
提前谢谢你:)
答案 0 :(得分:1)
CUDA有built-in variables,如threadIdx.x
和blockIdx.x
,用于标识块中的每个线程,以及该线程所在的块。块中的每个线程都具有相同的{{ 1}}值,但块中的每个线程将具有不同的/唯一的(每块)blockIdx.x
值。
因此,我们可以使用threadIdx.x
为每个块选择特定序列。此变量可用于选择正确的序列长度以及每个序列/块的偏移量。
我们可以为每个序列项/字符分配一个线程。我们可以使用blockIdx.x
为每个线程确定它应该选择哪个序列成员。
这是一个完整的例子:
threadIdx.x
如果你希望一个序列中有超过1024个字符,那么你可能想要修改上面的内容,也许是让每个线程处理多个字符,也许是在循环中。