CUDA中数据数组和指向数据指针的共享内存的动态分配
dynamic allocation of shared memory for array of data and pointers to data in CUDA
我是 CUDA 的初学者,我正在尝试为双精度数据类型和指向双精度数据类型的指针分配共享内存。我正在使用
分配数据
extern __shared__ double dataShared[];
在这里,我想要在特定位置指向此数据的指针
int v = threadIdx.x;
dataShared[v] = &dataShared[v + (v+1)*data.V];
我想要一个二维双数据数组和一维指针数组,它指向共享内存中二维数组的每一列。由于性能影响,我在这里避免指针数组的动态分配。这里指针数组被移位并用于访问列,因此二维数组将被列移位。
但是这是不允许的,我有没有其他方法可以做到这一点。目前我正在使用 cuda 7.5,如果有人可以建议 cuda 8.0 中是否有任何新功能来实现这一点,那会更好。
您可以使用 2 个不同类型的不同指针指向同一个共享内存块:
extern __shared__ char dataShared[];
double ** columns = (double **) dataShared; //Here you can store pointers to columns
double * realData = (double *) (dataShared + N * sizeof(double *)); //N is the number of columns
此处您使用了一个共享内存块,但它的 2 个区域使用了不同的偏移量(指向列的指针的偏移量为 0,实际数据的偏移量为 N * sizeof(double *)
)。
我是 CUDA 的初学者,我正在尝试为双精度数据类型和指向双精度数据类型的指针分配共享内存。我正在使用
分配数据extern __shared__ double dataShared[];
在这里,我想要在特定位置指向此数据的指针
int v = threadIdx.x;
dataShared[v] = &dataShared[v + (v+1)*data.V];
我想要一个二维双数据数组和一维指针数组,它指向共享内存中二维数组的每一列。由于性能影响,我在这里避免指针数组的动态分配。这里指针数组被移位并用于访问列,因此二维数组将被列移位。
但是这是不允许的,我有没有其他方法可以做到这一点。目前我正在使用 cuda 7.5,如果有人可以建议 cuda 8.0 中是否有任何新功能来实现这一点,那会更好。
您可以使用 2 个不同类型的不同指针指向同一个共享内存块:
extern __shared__ char dataShared[];
double ** columns = (double **) dataShared; //Here you can store pointers to columns
double * realData = (double *) (dataShared + N * sizeof(double *)); //N is the number of columns
此处您使用了一个共享内存块,但它的 2 个区域使用了不同的偏移量(指向列的指针的偏移量为 0,实际数据的偏移量为 N * sizeof(double *)
)。