好的,所以我有这个庞大的数组,我们称之为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)值?
答案 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的关键部分。