将条件作为参数传递给 OpenCL 内核

Posted

技术标签:

【中文标题】将条件作为参数传递给 OpenCL 内核【英文标题】:Pass condition as argument to an OpenCL kernel 【发布时间】:2022-01-14 16:54:57 【问题描述】:

我正在尝试编写一个将条件(即布尔值)作为参数的 OpenCL 内核。我的目标是编写一个以下列方式运行的内核:

__kernel void operation(
    __global double *vec,
    const bool condition,  // is this possible?
    const int n)

    // ...
    if(condition)
        // do this ...
    
    else
        // do that ...
    

我发现这个thread 说不可能做我想做的事,但讨论有点过时了,我想知道是否有任何改变。

所以基本上就是这样。我完全愿意接受建议。

提前致谢!

【问题讨论】:

【参考方案1】:

基本上你可以做到这一点。但是,bool(1 位)不允许作为内核参数。您必须使用char(8 位)或int(32 位)作为condition 变量的数据类型。如果您将condition 的值设置为0 (false) 或1 (true),您可以直接将其插入if(condition)

我假设condition 在您的情况下对于所有线程来说都是相同的值。出于性能原因,我建议制作两个单独的内核,一个用于if 分支,一个用于else 分支,并将condition 移动到C++ 端以将两个内核中的任何一个排入队列。

【讨论】:

以上是关于将条件作为参数传递给 OpenCL 内核的主要内容,如果未能解决你的问题,请参考以下文章

如何将多个重复的参数传递给 CUDA 内核

将对象作为参数传递给函数

如何使用 GRUB 0.97 menu.lst 将参数传递给内核?

将列表作为参数传递给 Python C 模块?

为啥我们将字符串数组作为参数传递给 main() 方法,为啥不传递任何集合类型或包装类型或原始类型?

将组合框作为参数传递给表单