【问题标题】:dynamic allocation of shared memory for array of data and pointers to data in CUDA为数据数组和指向 CUDA 中数据的指针动态分配共享内存
【发布时间】:2016-11-21 21:46:31
【问题描述】:

我是 CUDA 的初学者,我正在尝试为双精度数据类型和指向双精度数据类型的指针分配共享内存。我正在使用

分配数据
extern __shared__ double dataShared[];

在这里,我想要在特定位置指向此数据的指针

int v = threadIdx.x;
dataShared[v] = &dataShared[v + (v+1)*data.V];

我想要一个二维双数据数组和一维指针数组,它们指向共享内存中二维数组的每一列。由于性能影响,这里我避免动态分配指针数组。这里指针数组被移位并用于访问列,因此二维数组将被列移位。

但是这是不允许的,还有其他方法可以实现吗?目前我正在使用 cuda 7.5,如果有人可以建议 cuda 8.0 中是否有任何新功能来实现这一点,那就更好了。

【问题讨论】:

  • 不清楚你在问什么。这一行:dataShared[v] = &dataShared[...] 没有意义,因为您将指针类型的值分配给 double 类型的数组元素。我严重怀疑 CUDA 是否存在问题。您可能想首先尝试为纯 C 提出解决方案。它当然也适用于 CUDA。为了获得有意义的答案,您需要发布更多代码和/或更好地解释您的意图。它也可能是XY problem,因此您可能需要添加一些有关您尝试解决的问题的上下文的更多信息

标签: c++ cuda shared-memory


【解决方案1】:

您可以使用 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 *) 用于您的实际数据)。

【讨论】:

    猜你喜欢
    • 2021-12-09
    • 2015-06-19
    • 2015-12-10
    • 2013-04-18
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    • 2013-05-26
    • 2013-10-04
    相关资源
    最近更新 更多