std :: vector转换为cl_float

时间:2013-08-25 00:24:16

标签: c++ opencl stdvector

我一直在努力将二维向量转换为openCL float数组。

定义测试数组和动态矢量:

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

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

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

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

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

你需要像

这样的东西
input_float = Jacobian[0][0];

vector个实例不会像内置数组一样自动衰减到指针中。

答案 1 :(得分: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++; 
     }
}