标准::向量转换为cl_float

std::vector conversion to cl_float

本文关键字:float cl 转换 向量 标准      更新时间:2023-10-16

我一直在努力将二维向量放入 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++程序中使用雅可比程序做很多工作,最终需要将其传递给 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);

任何帮助都非常感谢。

指针

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

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

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

你需要类似的东西

input_float = Jacobian[0][0];

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

以下代码有效:

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