首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OpenCL内核中的读写竞争条件会导致数据损坏吗?

OpenCL内核中的读写竞争条件会导致数据损坏吗?
EN

Stack Overflow用户
提问于 2015-03-18 21:02:27
回答 1查看 739关注 0票数 0

考虑到一对OpenCL内核,它可以读取和写入相同的内存位置。作为一个简单的例子,请考虑以下OpenCL程序:

代码语言:javascript
运行
复制
__kernel void k1(__global int * a)
{
    a[0] = 2*a[1];
}

__kernel void k2(__global int * a)
{
    a[1] = a[0]-1;
}

如果启动多个线程,运行这些内核中的许多,则全局内存的结果状态是不确定的。

这仍然可能允许编写异步算法,这些算法可以接受内核中任何可能的操作顺序。

但是,这要求读写全局GPU内存是原子

我的问题是

  • 这在任何当前的GPGPU硬件上都保证是正确的吗?
  • 如果这被OpenCL标准认为是未定义的行为呢?如果是这样的话,常见的实现(特别是包含在CUDA工具包中的实现)会做什么?
  • 怎样才能检验这种担忧呢?
EN

回答 1

Stack Overflow用户

发布于 2015-03-18 21:33:15

如果将内核命令排队到一个作为顺序队列创建的命令队列(即创建它时没有指定CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE ),那么一次只执行一个内核命令。这意味着在不同的内核实例之间不会出现任何这样的问题(尽管在单个内核实例中的工作项之间仍然可能存在争用条件,如果它们访问相同的内存位置)。

如果您使用的是无序队列或多个命令队列,则可能确实存在争用条件。无法保证加载修改存储序列将是原子操作,这将导致未定义的行为。

根据您对内核的实际需要,您可以使用OpenCL的内置原子函数,这些函数允许您以原子方式执行一组特定的读-修改-写入操作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29132592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档