2014-01-30 49 views
1

我有一个算法,我想运行使用一个可能长的双数组。由于数组的长度可能达数百万,我将它放在GPU上,因此我需要将数组从CPP文件导出到CU文件。然而,我现在只是在CPP中原型化它,因为它在任何情况下都不起作用。将指针设置为for循环中的双数组

在我的CPU原型中,当我尝试使用for循环设置双数组的成员时,出现错误。例如,包括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

该数组从'&inputMeshPts_PROXY [0] [0]'开始。你有'&inputMeshPts_PROXY [size] [4]'是waaay的结尾,实际上非法甚至计算指针。 –

回答

0

inputMeshPts_CUDA是指向double - 也就是说,它可以代表一维数组。您正在以二维数组的形式访问它:inputMeshPts_CUDA[i][j]。这没有任何意义 - 您正在有效地将[j]应用到double对象存储区inputMeshPts_CUDA[i]

我相信你一直在寻找inputMeshPts_CUDA[i * 4 + j] - 你必须自己计算2D地址。

+0

二维数组存储为连续内存,其中一个地址是'double *'(单一间接)。但是,不,指针算术不起作用。 –

+0

它不是我* 3 + j而是我* 4 + j。 – Joky

+0

@ BenVoigt是的,这就是我的意思 - 你不能在'double *'上使用2D数组索引。 – Angew

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

当然,这只适用于编译时已知大小的情况。

+0

基于模板的解决方案的另一个缺点是该模板针对不同的数组大小重新实例化。 –

+0

Cuda支持“VLA”类似声明,据我所知: void func(int size,int(* ptr)[size]) – Joky

3

当你写:

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

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

inputMeshPts_CUDA[i*4+j] 

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

double (*inputMeshPts_CUDA)[4] = inputMeshPts_PROXY; 

,让您再次使用二维索引。

+0

最后一行是一个野指针(是的,我知道这个问题也错了) –

+0

固定(愚蠢的复制/粘贴) – Joky