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

How to load values into extern shared array

本文关键字:外部 共享 数组 加载      更新时间:2023-10-16

将数组从全局内存加载到共享内存时,共享内存中的变量无法执行我想要的操作。

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)将指向相同的位置。

如果希望使用动态分配的共享内存来创建多个阵列,则必须按照编程指南中给出的说明进行操作。类似这样的东西:

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

应该起作用。

并且确保在内核启动参数中传递一个大小分配,该大小分配对于array1的大小和array2的大小都是足够的字节