如何将值加载到外部共享数组

how to load values into extern shared array

将数组从全局内存加载到共享内存时,共享内存中的变量没有按照我的要求执行。

template<class T>
__global__ void kernel(T *t1,T *t2)
{
     int tid=threadIdx.x;
     extern __shared__ T array1[];
     extern __shared__ T array2[];
     array1[tid]=t1[tid];//copy (1)
     array2[tid]=t2[tid];//copy (2)
     __syncthreads();
}

事实证明 array1[tid]=array2[tid]=t2[tid]。 当交换copy(1)和copy(2)的位置时,结果是array1[tid]=array2[tid]=t1[tid]。 只有当我删除 "extern" 时,结果才会如我所愿(array1[tid]=t1[tid],array2[tid]=t2[tid])。 谁能解释一下为什么?

这个:

 extern __shared__ T array1[];
 extern __shared__ T array2[];

不会像你想的那样工作。

那些指针(array1array2)将指向相同的位置。

如果您希望多个数组使用动态分配的共享内存,您必须遵循 programming guide 中给出的说明。像这样:

 extern __shared__ T array1[];
 T * array2 = array1 + size_of_array_1;

应该可以。

并确保在内核启动参数中传递大小分配,该大小分配对于 array1 的大小和 array2

的大小都有足够的字节