如何将值加载到外部共享数组
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[];
不会像你想的那样工作。
那些指针(array1
和 array2
)将指向相同的位置。
如果您希望多个数组使用动态分配的共享内存,您必须遵循 programming guide 中给出的说明。像这样:
extern __shared__ T array1[];
T * array2 = array1 + size_of_array_1;
应该可以。
并确保在内核启动参数中传递大小分配,该大小分配对于 array1
的大小和 array2
的大小都有足够的字节
将数组从全局内存加载到共享内存时,共享内存中的变量没有按照我的要求执行。
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[];
不会像你想的那样工作。
那些指针(array1
和 array2
)将指向相同的位置。
如果您希望多个数组使用动态分配的共享内存,您必须遵循 programming guide 中给出的说明。像这样:
extern __shared__ T array1[];
T * array2 = array1 + size_of_array_1;
应该可以。
并确保在内核启动参数中传递大小分配,该大小分配对于 array1
的大小和 array2