二维锯齿数组到一维数组的c++



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

伪代码示例:

x[0] = [1, 4, 3, 9]
x[1] = [2, 0]
x[2] = [5, 7, 6]
y = flatten(x)  // Eg.: [1, 4, 3, 9, 2, 0, 5, 7, 6]
get_index(a, b) // Should return index in 1D array
                // that coresponds to element in original 2D array
y[get_index(0, 2)] = 4
y[get_index(1, 0)] = 2
y[get_index(2, 2)] = 7

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

编辑:

我需要访问1D数组元素,就像它是2D使用参数,例如。: a &b。

两种可能的方法:

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

  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]间接进行,因此这种方法可能会导致设备上的访问速度变慢。

如果您不知道每行中有多少列,我不知道如何使用数组进行此操作。对于vector,有一种简单的方法可以做到这一点,因为您可以使用迭代器范围。你可以这样做:

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());

相关内容

  • 没有找到相关文章