考虑到一对OpenCL内核,它可以读取和写入相同的内存位置。作为一个简单的例子,请考虑以下OpenCL程序:
__kernel void k1(__global int * a)
{
a[0] = 2*a[1];
}
__kernel void k2(__global int * a)
{
a[1] = a[0]-1;
}如果启动多个线程,运行这些内核中的许多,则全局内存的结果状态是不确定的。
这仍然可能允许编写异步算法,这些算法可以接受内核中任何可能的操作顺序。
但是,这要求读写全局GPU内存是原子。
我的问题是
发布于 2015-03-18 21:33:15
如果将内核命令排队到一个作为顺序队列创建的命令队列(即创建它时没有指定CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE ),那么一次只执行一个内核命令。这意味着在不同的内核实例之间不会出现任何这样的问题(尽管在单个内核实例中的工作项之间仍然可能存在争用条件,如果它们访问相同的内存位置)。
如果您使用的是无序队列或多个命令队列,则可能确实存在争用条件。无法保证加载修改存储序列将是原子操作,这将导致未定义的行为。
根据您对内核的实际需要,您可以使用OpenCL的内置原子函数,这些函数允许您以原子方式执行一组特定的读-修改-写入操作。
https://stackoverflow.com/questions/29132592
复制相似问题