我一直在努力将二维向量转换为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);
非常感谢任何帮助。
答案 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++;
}
}