OpenCL-主内核填充缓冲区并在子内核上运行
作为OpenCL的新手,我想知道以下场景是否可行 内存中创建了10个长度为10000的缓冲区,或者一个10xN的图像缓冲区作为缓存 第一个内核是填充缓存中的一行,并查询另一个内核对该行执行一些工作。当第二个内核完成时,第一个内核可以计算一个新行并替换旧行,相同的过程将继续,直到第一个内核不再有任务为止OpenCL-主内核填充缓冲区并在子内核上运行,opencl,kernel,Opencl,Kernel,作为OpenCL的新手,我想知道以下场景是否可行 内存中创建了10个长度为10000的缓冲区,或者一个10xN的图像缓冲区作为缓存 第一个内核是填充缓存中的一行,并查询另一个内核对该行执行一些工作。当第二个内核完成时,第一个内核可以计算一个新行并替换旧行,相同的过程将继续,直到第一个内核不再有任务为止 这个场景有意义吗?它可以在GPU编程中实现吗?OpenCL不允许内核调用其他内核。但你有一些选择 让第一个内核调用另一个非内核函数。工作项之间的工作分配在这里不会改变——因此,如果有10个并行工作
这个场景有意义吗?它可以在GPU编程中实现吗?OpenCL不允许内核调用其他内核。但你有一些选择
缓冲区是如何填充的?从档案中?OpenCL内核无法读取文件、网络等。因此,如果原始数据是这样加载的,则必须在主机上执行。但是,如果这些图像缓冲区是从其他源创建的(例如,通过算法或从另一个内存中的源创建的),那么应该可以正常工作(尽管您也需要将任何其他内存中的源复制到GPU)。这正是我的情况。上述第一项和第二项任务的工作项比率为1:2000。因此,选项2是我问题的答案。我在示例中提到了10行,因为我需要一些缓冲区来保存第二个任务的数据,如果它刚刚开始执行所有任务,那么内存需求将非常大。因此,如果第一个内核有N个任务,是否可以告诉您,在同一时间只运行10个工作项,并且在第二个任务完成时只继续一个新的工作项?我还考虑将第一个任务保留在主机上,将输入数据写入gpu并将第二个任务排入队列,然后在完成后读取结果并将一组新的输入写入gpu并排入队列再一次。但是如果第一个任务也可以在gpu上完成,我就不需要从主机到gpu写那么多。@s093294不同的gpu硬件将有不同的性能。将第一个任务保留在主机上可能会更快,这取决于将内存从主机复制到设备所需的时间,这取决于设备、主机和需要复制的内存量。您可能希望同时尝试这两种方法,并选择一种最快的硬件。因此,如果第一个内核有N个任务,是否可以告诉它只同时运行10个工作项,并且在第二个任务完成时只继续一个新的工作项?这个工作组有关系吗。如果我将本地大小设置为32,这是否意味着它运行32个线程,并且只有在其他线程完成时才启动一次新线程。然后,我可以添加一个记忆体或者其他东西让它等待第二个任务吗?@s093294为答案添加了更多细节