使用Cuda处理多个大小的阵列

时间:2013-05-24 18:00:24

标签: arrays cuda

好的,所以我有这个庞大的数组,我们称之为J

现在,对于J的每个元素,都有一个关联的数组TJ但是TJ的长度相对于J

是可变的

因此,例如secuencial程序将看起来像这样

for(J=0;J<length(ARRAY_J))
do
  for(T=0;T<length(ARRAY_TJ))
  do
    ARRAY_RESULT[J]+=ARRAY_J[J]+ARRAY_TJ[T]
  end
end

所以我想如果我在2D块中安排我的线程,我可以使用线程的x索引作为J和线程的y索引T

现在我知道J的长度,但是T的长度不同,所以我不知道如何在Cuda中定义它。

例如

ARRAY_RESULT[blockidx.y*blockDim.y+threadidx.y]+=ARRAY_J[blockidx.y*blockDim.y+threadidx.y]+ARRAY_TJ[blockidx.x*blockDim.x+threadidx.x]

那么考虑到ARRAY_TJ的长度是多变的,我怎么能在这里定义块的尺寸?我应该使用最长的ARRAY_TJ吗?但那么像上面那样的代码会起作用吗?对于ARRAY_J的每个值,它将总和(ARRAY_TJ)值?

1 个答案:

答案 0 :(得分:1)

我认为使用1D块更好,长度为J 线程,并在每个线程中执行

int thread = blockIdx.x * blockDim.x + threadIdx.x;
for(T=0;T<length(ARRAY_TJ))
    ARRAY_RESULT[thread]+=ARRAY_J[thread]+ARRAY_TJ[T]

如果您尝试在2D中使用TJ数组的第二个维度,则多个线程将同时写入ARRAY_RESULT的相同位置(带有问题)并且没有简单的管理在cuda的关键部分。