在OpenCL中的循环中传递主机和内核代码的变量之间的值

时间:2016-11-10 21:24:49

标签: opencl

由于某些矢量数据类型,我在主机代码和内核代码之间传递值时遇到了麻烦。以下代码/解释仅用于引用我的问题,我的代码更大更复杂。有了这个小例子,希望我能够解释我遇到问题的地方。如果有更多需要,请告诉我。

std::vector<vector<double>> output;

for (int i = 0;i<2; i++)
{
  auto& out = output[i];
  sum =0;
  for (int l =0;l<3;l++)
  {
   for (int j=0;j<4; j++)
   {
    if (some condition is true)
     { out[j+l] = 0.;}
    sum+= .....some addition...
   }
 out[j+l] = sum
 }
}

现在我想从第二个循环并行化这个代码。这就是我在主机代码中所做的:

cl::buffer out = (context,CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, output.size(), &output, NULL)

然后,我设置了参数

cl::SetKernelArg(0, out);

然后循环,

for (int i = 0,i<2, i++)
{
  auto& out = output[i];
  // sending some more arguments(which are changing accrding to loop) for sum operations
  queue.enqueueNDRangeKernel(.......)
  queue.enqueuereadbuffer(.....,&out,...)
 }

在内核代码中:

__kernel void sumout(__global double* out, ....)
{
  int l = get_global_id(0);
  int j = get_global_id(1);
    if (some condition is true)
     { out[j+l] = 0.;  // Here it goes out of the loop then
       return}
    sum+= .....some addition... 
     }
 out[j+l] = sum
}

现在,如果条件 out [j + l] 循环中变为0。所以外出价值经常变化。在普通代码中,它是一个指向向量的引用指针。在我的内核和主机代码中,我无法从输出中读取输出中的值。我想读取每个 out [j + l] output [i] 中的值。但我很困惑,因为这个缓冲区和矢量。

为了进一步澄清,输出是向量的向量, out 是输出向量的参考向量。我需要为输出中的每次更改更新输出中的值。由于这些是向量,我将 out 作为cl缓冲区传递。我希望很清楚。 请告诉我,如果需要代码,我会尽量提供。

1 个答案:

答案 0 :(得分:3)

您正在向opencl发送向量指针(当然它们在指针级别上是连续的)但是整个数据在内存中不连续,因为每个内部向量指向不同的内存区域。 Opencl无法将主机指针映射到设备内存,并且此api中没有此类命令。

您可以使用数组向量(最新版本)或纯数组。