在for循环中设置指向double数组的指针

时间:2014-01-30 21:28:32

标签: c++ arrays pointers cuda maya

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

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

或者如果从CU文件运行相同的代码,则error:expression必须具有指向对象的指针类型

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
        }
    }
}

3 个答案:

答案 0 :(得分:3)

当你写作时:

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

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

inputMeshPts_CUDA[i*4+j]

或者你可以声明“正确”你的指针:

double (*inputMeshPts_CUDA)[4] = inputMeshPts_PROXY;

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

答案 1 :(得分:2)

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])

当然,这仅在编译时知道大小时才有效。

答案 2 :(得分:0)

inputMeshPts_CUDA是指向double的指针 - 也就是说,它可以代表一维数组。您将其作为2D数组访问:inputMeshPts_CUDA[i][j]。这没有意义 - 您有效地将[j]应用于double的{​​{1}}对象商店。

我相信您正在寻找inputMeshPts_CUDA[i] - 您必须自己计算2D地址。