0

我一直在努力将二维向量放入 openCL 浮点数组。

像这样定义一个测试数组和一个动态向量:

double ABCD[2][2];                                      //Works
vector< vector<float> > Jacobian(0, vector<float>(0));  //Doesn't work
cl_float *input_float;                                  //openCL Input Array

我在 C++ 程序中使用 Jacobian 进行了大量工作,最终需要将其传递给 openCL 程序。

input_double = *ABCD;       //works fine in the openCL program
input_float = Jacobian;     /*error C2440 no suitable conversion 
                            from std::vector to cl_float exists*/

没有多少玩指针可以使这项工作。关于如何将动态向量放入 cl_float 结构的任何想法?恕我直言,缺乏文档。

最终,我将它放在它自己的缓冲区中,并在 GPU 中处理它。

inMapPtr = clEnqueueMapBuffer(
                    commandQueue, 
                    inplaceBuffer, 
                    CL_FALSE, 
                    CL_MAP_WRITE, 
                    0, 
                    SIZE_F, 
                    0, 
                    NULL, 
                    &inMapEvt, 
                    &status);
memcpy(inMapPtr, input_float, SIZE_F);

任何帮助深表感谢。

4

2 回答 2

1

指针不是数组。数组不是指针。double ABCD[2][2];不是double指向 2 个 2 doubles 数组的长度为 2 的指针数组;它是一个 4 doubles 的单个内存块,带有将一对索引转换为正确索引的语法糖。

A vectorof vectors 是完全不同的数据结构,不能解释为多维数组。vector仅支持一维数组。

input_float = Jacobian;     /*error C2440 no suitable conversion 
                            from std::vector to cl_float exists*/

你需要类似的东西

input_float = Jacobian[0][0];

vector实例不会像内置数组那样自动衰减为指针。

于 2013-08-25T00:29:01.290 回答
0

以下代码有效:

int i = 0;
for (int x = 0; x <= 2; x++)  // loop 3 times for three lines
{
     for (int y = 0; y <= 2; y++)  // loop for the three elements on the   line
     {
        input_float[i] = Jacobian[x][y]; // copy to input_float
        i++; 
     }
}
于 2013-08-25T00:52:31.420 回答