在C ++中,2D锯齿状数组到1D数组

时间:2015-07-27 20:12:40

标签: c++ c arrays multidimensional-array cuda

我需要将动态数组的动态数组转换为1D数组以进行CUDA计算。

伪代码示例:

long

我发现将2D数组传递给CUDA内核的最佳方法是将其展平,但它仅适用于矩阵(i = block.x * M + block.y),但不适用于每行具有不同列数的情况。

提前谢谢。

修改

我需要访问一维数组元素,就像使用params一样2D,例如:a&湾

2 个答案:

答案 0 :(得分:3)

两种可能的方法:

  1. 创建一个尺寸与最大x尺寸相等的二维矩阵。因此,如果x是长度为N的指针数组(每个为向量),并且任何单个向量的最大维数为M,则创建C(N,M),并用C填充C的每一行x的向量。然后将其压平并将其转移到设备上。这种方法虽然需要额外的存储空间,但可能会在设备上实现最快的访问速度。

  2. 创建"压缩"存储格式:

    xh = [1, 4, 3, 9, 2, 0, 5, 7, 6]
    xi = [0, 4, 6]
    

    将这些向量传输到设备(它们已经是平坦的。)在设备上,通过以下方式访问向量j的成员i:

    myval = xh[xi[j] + i];
    

    对于此方法,您可能还希望传递限制向量:

    xl = [4, 2, 3]
    

    由于每次访问可能需要间接xi[j],因此此方法可能导致设备访问速度变慢。

答案 1 :(得分:0)

如果您不知道每行中有多少列,我不知道如何使用数组执行此操作。有一个简单的方法可以使用向量来执行此操作,因为您可以使用迭代器范围。你可以这样做:

std::vector<std::vector<int>> data2d;
std::vector<int> data1d;
data1d.reserve(data2d.size() * data2d[0].size()); // reserve some memory.  this is a guess of what is needed
for (const auto row : data2d)
    data1d.insert(data1d.end(), row.begin(), row.end());