gpt4 book ai didi

c++ - C++ 中的二维锯齿状数组到一维数组

转载 作者:太空宇宙 更新时间:2023-11-04 07:07:14 27 4
gpt4 key购买 nike

我需要将动态数组的动态数组转换为一维数组以进行 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

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

编辑:

我需要使用参数像访问二维数组元素一样访问一维数组元素,例如:a & b。

最佳答案

两种可能的方法:

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

  2. 创建“压缩”存储格式:

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

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

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

    对于此方法,您可能还想传递一个限制 vector :

    xl = [4, 2, 3]

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

关于c++ - C++ 中的二维锯齿状数组到一维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31662370/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com