如何将C ++ std :: vector传递给openCL内核?

时间:2014-09-10 19:05:22

标签: c++ opencl gpgpu

我在C ++中使用二维向量实现矩阵类(vector<vector<float>>())。我现在想使用openCL使用GPGPU优化代码。但我每个迷你都会遇到问题。所以请帮助我,并给我这样的提示。

我的要求如下

  1. 由于我想使用这个矩阵库来实现机器学习算法,可能会有很大的矩阵,比如1000 * 400。
  2. 我可以使用二维向量并将它们传递给opencl内核(因为如果我可以使用向量来实现这个类,那么使用数组从头开始实现它们会容易得多。)
  3. 我的一个代码段如下所示,在我的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;
       }
    }
    

1 个答案:

答案 0 :(得分:4)

您正在使用多维矢量。

这意味着,外部向量包含连续方式的内部向量。但内容是一个类,而不是简单的数据。因此,使用初始化OpenCL内存对象的数据不是连续的。使用向量类实现数据的内部初始化cl_mem,而不是矩阵数据。

使用大小为MxN的单向量。看看this SO questionon