OpenCL如何保存和重用一些命令?

时间:2018-04-21 10:14:26

标签: c opencl

我是OpenCL的新手。我正在尝试实现我自己的固定管道渲染器,就像OpenGL 1那样。我使用OpenCL的第一个版本,所以我不能调用内核中的任何内核。我创建了自己的三角绘图功能没有问题。我想在像素级别进行每个三角形的并行化,所以我需要多次调用相同的内核。我可以在OpenGL 1中创建类似系统的显示列表吗?我可以用

绘制一个三角形
clEnqueueNDRangeKernel(command_queue,k_drawTriangle,1,NULL,&global_item_size,&local_item_size,0,NULL,NULL);

绘图后我应该在任何地方使用clFlush吗?或者我应该在必要时何时使用它?

clFlush和clFinish如何在这里工作?我可以在我创建的单独命令队列中保存许多命令并一次又一次地使用这组命令吗?

这样的东西
Q = clCreateCommandQueue(context,device_id,0,&ret);

{
    int i;
        for(i=0; i<100; i++)
        CLdrawTriangleD(Q,tri2i(0,0,400,200,0,400));    
}

(CLdrawTriangleD包含包含Q的clEnqueueNDRangeKernel)

因此,Q间接定义了一组绘制模型的命令,例如。

我不想学习关于OpenCL的每一个想法。为了总结这个问题,我唯一想知道的关于OpenCL的是我如何保存一些命令并在另一个上下文中调用同一组命令?在不清除命令列表的情况下反复调用Q.

该主题的更好摘要:

如何在单个事件后将多个命令排入队列执行失序?如何在不删除命令队列成分的情况下随时触发该事件。

1 个答案:

答案 0 :(得分:-1)

我认为你错误地理解了OpenCL编程范式。 OpenCL内核不是用于执行一个小任务(比如绘制一个三角形);他们可以完成同一任务的许多不同实例(比如绘制场景中的所有三角形),或者可以分解为许多小型协作动作的单个大型任务。

所以,如果要绘制100个三角形,你可以调用draw_triangle内核,但是每个工作组处理一个三角形 - 所以你有100个工作组,每个工作组都有一些相关的大小做你的并行工作。