如何将OpenCL任务分割成更小的块?

如何将OpenCL任务分割成更小的块?,opencl,gpgpu,Opencl,Gpgpu,我正在使用OpenCL将一个长向量乘以另一个向量。 特别是,第二个向量实际上是一个余弦函数,其中输入参数是全局_id 由于我的GPU限制了RAM大小(3 GB),要对大于该大小的向量执行上述任务,我需要将长向量切分为短向量,然后逐个执行 最初,我是通过在clEnqueueMapBuffer函数中引入偏移量并在其上循环实现的: void* p_map_inV = clEnqueueMapBuffer(queue, d_inV, CL_TRUE, CL_MAP_READ, m*mem_size_ch

我正在使用OpenCL将一个长向量乘以另一个向量。 特别是,第二个向量实际上是一个余弦函数,其中输入参数是全局_id

由于我的GPU限制了RAM大小(3 GB),要对大于该大小的向量执行上述任务,我需要将长向量切分为短向量,然后逐个执行

最初,我是通过在clEnqueueMapBuffer函数中引入偏移量并在其上循环实现的:

void* p_map_inV = clEnqueueMapBuffer(queue, d_inV, CL_TRUE, CL_MAP_READ, m*mem_size_chunk, mem_size_chunk, 0, NULL, NULL, &error);
其中m是循环变量。这似乎是可行的,但我意识到增加向量长度所花费的时间不仅仅是线性的。这让我觉得有一些开销,也许我使用了错误的方法

您认为我可以通过单独执行内核来实现这一点吗?例如,将偏移添加到全局_id


如果您能让我知道这样做的典型方式,我想这是很常见的。您能描述一下如何在不同的块之间循环吗?我们需要更多的信息来帮助Hi Ruyk,谢谢你的评论,我认为问题已经解决,性能可能是由其他原因造成的。在任何情况下,代码现在的工作方式如下:为GPU-->创建安全大小的缓冲区-->用于循环开始-->使用指针记录开始位置-->计算-->从设备写入主机-->用于循环结束-->重复-->将数据从主机传输到设备