将指针设置为双阵列以进行循环

Setting pointer to a double array in for loop

本文关键字:循环 阵列 指针 设置      更新时间:2023-10-16

我有一个我想运行的算法,该算法使用潜在的长阵列。因为数组的长度可以数百万,所以我将其放在GPU上,因此我需要将数组从CPP文件导出到CU文件。但是,IM仅在CPP中进行原型分型,因为它在任何一种情况下都不起作用。

在我的CPU原型中,当我尝试使用for循环设置双阵列的成员时,我会发现错误。例如,包括COUT在内的任何操作都会给出错误C2109:下标在CPP文件中需要数组或指针类型

或如果从CU文件运行相同的代码,则错误:表达式必须具有指针对象类型

const int size = 100000;
double inputMeshPts_PROXY[size][4];
inputMeshPts.get(inputMeshPts_PROXY);
int lengthPts = inputMeshPts.length();
if (useCUDA == 1)
{
    double *inputMeshPts_CUDA = &inputMeshPts_PROXY[size][4];
    myArray(lengthPts, inputMeshPts_CUDA);
}
MStatus abjBlendShape::myArray(int length_CUDA, float weight_CUDA, double *inputMeshPts_CUDA)
{
    for (int i = 0; i < length_CUDA; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            cout << inputMeshPts_CUDA[i][j] << endl;
            // inputMeshPts_CUDA[i][j] += (sculptedMeshPts_PROXY[i][j] - inputMeshPts_CUDA[i][j]); // WHAT I WANT, EVENTUALLY
        }
    }
}

写作时:

double *inputMeshPts_CUDA = &inputMeshPts_PROXY[size][4];

变量inputmeshpts_cuda是纯指针。您不能像以前那样使用二维索引[] []。访问它的正确方法是将索引线性化:

inputMeshPts_CUDA[i*4+j]

另外,您可以声明"正确"指针:

double (*inputMeshPts_CUDA)[4] = inputMeshPts_PROXY;

允许您再次使用二维索引。

MStatus abjBlendShape::myArray(int length_CUDA, float weight_CUDA, double *inputMeshPts_CUDA)
{

inputMeshPts_CUDA只是一个指针,编译器丢失了所有维度信息。它需要inputMeshPts_CUDA[i][j]的尺寸信息,该信息将转换为访问地址的访问(字节算术,而不是C 指针算术)

inputMeshPts_CUDA + i * sizeof (double) * num_colums + j * sizeof (double)

您可以自己提供丢失的信息,并像Angew建议一样执行算术,或者使编译器通过:

通过:
template<size_t M, size_t N>
MStatus abjBlendShape::myArray(int length_CUDA, float weight_CUDA, double (&inputMeshPts_CUDA)[M][N])

当然,这仅在汇编时间已知大小时才起作用。

inputMeshPts_CUDAdouble的指针 - 也就是说,它可以代表1D数组。您正在以2D阵列:inputMeshPts_CUDA[i][j]访问它。这是没有意义的 - 您有效地将[j]应用于inputMeshPts_CUDA[i]double对象。

我相信您正在寻找inputMeshPts_CUDA[i * 4 + j]-您必须计算2D解决自己。