我需要将动态数组的动态数组转换成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。
两种可能的方法:
-
创建一个2D矩阵,其维度等于最大的
x
维度。因此,如果x
是一个长度为N的指针数组(每个指向一个向量),并且任何单个向量的最大维数是M,那么创建C(N,M),并用x
的向量填充C的每一行。然后将其压平并转移到设备上。这种方法虽然需要额外的存储空间,但可能会在设备上产生最快的访问速度。 -
创建"压缩"存储格式:
xh = [1, 4, 3, 9, 2, 0, 5, 7, 6] xi = [0, 4, 6]
将这些向量转移到设备(它们已经是平面的)。在设备上,通过:
访问向量j的成员imyval = 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());