由于某些矢量数据类型,我在主机代码和内核代码之间传递值时遇到了麻烦。以下代码/解释仅用于引用我的问题,我的代码更大更复杂。有了这个小例子,希望我能够解释我遇到问题的地方。如果有更多需要,请告诉我。
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缓冲区传递。我希望很清楚。 请告诉我,如果需要代码,我会尽量提供。
答案 0 :(得分:3)
您正在向opencl发送向量指针(当然它们在指针级别上是连续的)但是整个数据在内存中不连续,因为每个内部向量指向不同的内存区域。 Opencl无法将主机指针映射到设备内存,并且此api中没有此类命令。
您可以使用数组向量(最新版本)或纯数组。