OpenCL如何保存和重用大量命令?

OpenCL如何保存和重用大量命令?,c,opencl,C,Opencl,我是OpenCL的新手。我正在尝试实现自己的固定管道渲染器,就像OpenGL 1一样。我使用的是OpenCL的第一个版本,所以我不能调用内核中的任何内核。我创建了自己的三角形绘图功能,没有问题。我想在像素级对每个三角形进行并行化,所以我需要多次调用同一个内核。我可以像OpenGL 1中的系统那样创建一个显示列表吗?我可以用它画一个三角形 clEnqueueNDRangeKernel(command_queue,k_drawTriangle,1,NULL,&global_item_size

我是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));    
}
CLDrawTriangeld包含包含Q的ClenqueEndRangeKernel

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

我不想了解OpenCL的一切。总结一下这个问题,关于OpenCL,我还想知道的唯一一件事是如何保存一些命令,并在另一个上下文中调用相同的命令集?在不清除命令列表的情况下反复调用Q

更好地总结该主题:


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

我认为您误解了OpenCL编程范例。OpenCL内核不适合做一个小任务,比如画一个三角形;它们用于完成同一任务的多个不同实例,比如绘制场景中的所有三角形,或者一个可以分解为许多小协作动作的大型任务


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

我的意思是每个三角形都要使用多个内核,每个内核代表一个像素。所以每个三角形都有并行化。当你试着用另一种方式做时,事情会变得比需要的慢得多。当你用一个核心画每个三角形时。每个核心必须绘制多个像素,这将使整个过程比它应该的慢得多。我已经试过你说的了。如果您有更好的方法将内核细分为更小的子内核,您可能想谈谈我不知道的另一个OpenCL属性。@newbie\u developer93:没有人说过任何关于物理内核分配的内容。单个物理内核可以执行多个工作组。此外,您可以以不同的方式构造网格,例如,每个工作组有多个三角形,或者每个三角形有多个工作组-我刚才只是举了一个例子。无论如何,你不会把一个内核细分成更小的子内核;单个内核可以做很多不同的事情。你可以通过细分像素来理解我的意思=增加并行化。。。我的问题是:如何向gpu发送一组命令,然后在OpenCL中随时在设备端执行?@newbie_developer93:在事件发生后将它们排队,然后触发事件并同步/刷新队列。我问的正是如何做到这一点。