如何在 OpenCL 内核中顺序执行函数?
How to execute functions sequentially in an OpenCL kernel?
我有一个 OpenCL 内核,它从设备内部调用某些函数并提供一些输出。我正在处理图像,以便首先执行垂直传递,然后完成水平传递。目前,我通过修改每次调用中的参数值从主机端调用内核两次。
kernel void image_filter(a, b, c, d)
{
func1(a, b, c, d);
if(<condition>)
func2(a, b, c, d);
}
现在我想修改内核,使其只能调用一次,同时执行水平和垂直通道。
kernel void image_filter(a, b, c, d)
{
// Vertical pass
func1(a, b, c, d);
if(<condition>)
func2(a, b, c, d);
// When execution of the above functions is complete
// Horizontal pass
// Some computation
func1(a, b, c, d);
if(<condition>)
func2(a, b, c, d);
}
请注意,垂直通道和水平通道之间存在数据依赖性。
这对于单个内核入队是不可能的,您必须使用两个内核入队。
为什么?因为 并非所有工作项都在其他工作项完成之前开始 。您无法控制它(这取决于运行时)。并且由于您指出垂直通道和水平通道之间存在数据依赖性,因此您需要在第二组开始之前完成所有第一组工作项。因此,两个内核入队。
TL;DR: 内核中没有全局同步(只有工作组同步)。使用两个队列。
我有一个 OpenCL 内核,它从设备内部调用某些函数并提供一些输出。我正在处理图像,以便首先执行垂直传递,然后完成水平传递。目前,我通过修改每次调用中的参数值从主机端调用内核两次。
kernel void image_filter(a, b, c, d)
{
func1(a, b, c, d);
if(<condition>)
func2(a, b, c, d);
}
现在我想修改内核,使其只能调用一次,同时执行水平和垂直通道。
kernel void image_filter(a, b, c, d)
{
// Vertical pass
func1(a, b, c, d);
if(<condition>)
func2(a, b, c, d);
// When execution of the above functions is complete
// Horizontal pass
// Some computation
func1(a, b, c, d);
if(<condition>)
func2(a, b, c, d);
}
请注意,垂直通道和水平通道之间存在数据依赖性。
这对于单个内核入队是不可能的,您必须使用两个内核入队。
为什么?因为 并非所有工作项都在其他工作项完成之前开始 。您无法控制它(这取决于运行时)。并且由于您指出垂直通道和水平通道之间存在数据依赖性,因此您需要在第二组开始之前完成所有第一组工作项。因此,两个内核入队。
TL;DR: 内核中没有全局同步(只有工作组同步)。使用两个队列。