在OpenCL中,步骤()是否算作条件?

在OpenCL中,步骤()是否算作条件?,opencl,gpgpu,Opencl,Gpgpu,OpenCL中的条件可能会影响性能,因为所有分支都将被评估。如果我可以使用step()来描述我的问题,那么这会避免这个问题吗?因为OpenCL只是一个API规范,最普遍的答案是:依赖于实现 然而,由于该函数可以(相对)轻松地在任何ALU上计算(通常只需一条指令),因此我认为假设答案是有效的否,这并不算作条件 关于问题的第二部分,就像@DarkZeros建议的那样,它并不能完全解决问题——但这是正确方向上的一步(呵呵):如果您可以使用step()函数的结果而不触发分支,那么您就很好了 为了举例说明

OpenCL中的条件可能会影响性能,因为所有分支都将被评估。如果我可以使用step()来描述我的问题,那么这会避免这个问题吗?

因为OpenCL只是一个API规范,最普遍的答案是:依赖于实现

然而,由于该函数可以(相对)轻松地在任何ALU上计算(通常只需一条指令),因此我认为假设答案是有效的,这并不算作条件

关于问题的第二部分,就像@DarkZeros建议的那样,它并不能完全解决问题——但这是正确方向上的一步(呵呵):如果您可以使用step()函数的结果而不触发分支,那么您就很好了

为了举例说明,假设我要执行以下操作:

if (x < 100) {
    z = foo();
    y = a[z];
}
else {
    y = a[x];
}

因此,这里没有分支-但我总是需要调用
foo()
(或内联它)-因此我的好处是有限的(或根本没有好处)。

它肯定可以解决问题,但不能完全解决问题。如果你用If/step来计算指令,你会发现差别不大。只有当你在一个工作组中存在分歧时,才会对所有分支进行评估。如果所有工作项都以相同的方式运行,则只运行该侧。
int s = step(100, x);
z = foo();
y = a[z * s + x * (1-s)];