我有一个我想要运行的算法,它使用了一个可能很长的双数组。因为数组的长度可能是数百万,所以我将它放在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
}
}
}
答案 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地址。