我在C ++中使用二维向量实现矩阵类(vector<vector<float>>()
)。我现在想使用openCL使用GPGPU优化代码。但我每个迷你都会遇到问题。所以请帮助我,并给我这样的提示。
我的要求如下
我的一个代码段如下所示,在我的kernal中,我尝试将10添加到每个元素。
但输出显示它只改变frist vector [0] [n] elemets中的值。
这是我主持人计划中的细分......
int in_vec_size = 100;
int out_vec_size = 100;
vector<vector<float>> in_vec(10,vector<float>(10));
vector<vector<float>> out_vec(10, vector<float>(10));
int k = 0;
//initialize the input vec
for (int i=0; i < 10;i++)
{
for (int j = 0; j < 10;j++)
{
in_vec[i][j] = k++;
out_vec[i][j] = 0;
}
}
//creating bufferes
cl::Buffer inBuff(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, in_vec_size*4, &in_vec[0][0]);
cl::Buffer outBuff(context, CL_MEM_WRITE_ONLY, out_vec_size*4, NULL);
//set kernal args
kernal.setArg(0, inBuff);
kernal.setArg(1, outBuff);
kernal.setArg(2, in_vec_size);
cl::CommandQueue queue(context, devices_gpu[0]);
queue.enqueueTask(kernal);
queue.enqueueWriteBuffer(inBuff, CL_TRUE, 0, in_vec_size*4, &in_vec[0][0]);
queue.enqueueReadBuffer(outBuff, CL_TRUE, 0, out_vec_size*4, &out_vec[0][0]);
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
cout << out_vec[i][j] << endl;
}
}
__kernel void add(__global float*in,__global float*out,int x)
{
// i=get_global_id(0);
for(int i=0;i<x;i++)
{
out[i] = in[i]+10;
}
}
答案 0 :(得分:4)
您正在使用多维矢量。
这意味着,外部向量包含连续方式的内部向量。但内容是一个类,而不是简单的数据。因此,使用初始化OpenCL内存对象的数据不是连续的。使用向量类实现数据的内部初始化cl_mem,而不是矩阵数据。
使用大小为MxN的单向量。看看this SO questionon。