【发布时间】:2019-11-08 20:20:00
【问题描述】:
我想运行一个经过检测的 OpenCL 内核来获取一些执行指标。更具体地说,我添加了一个隐藏的全局缓冲区,它将使用 N 个零从主机代码初始化。 N 个值中的每一个都是整数,它们代表不同的度量,每个内核实例将以不同的方式递增,具体取决于其执行路径。
一个简单的例子:
__kernel void test(__global int *a, __global int *hiddenCounter) {
if (get_global_id(0) == 0) {
// do stuff and then increment the appropriate counter (random numbers here)
hiddenCounter[0] += 3;
}
else {
// do stuff...
hiddenCounter[1] += 5;
}
}
内核执行完成后,我需要主机代码聚合(一个简单的元素向量加法)所有hiddenCounter 缓冲区并打印适当的结果。
我的问题是当多个内核实例尝试写入hiddenCounter 缓冲区的同一索引时是否存在竞争条件(这肯定会在我的项目中发生)。我需要强制执行某种同步吗?或者这对于__global 参数是不可能的,我需要将其更改为__private?之后我能否从主机代码中聚合 __private 缓冲区?
【问题讨论】: