【问题标题】:OpenCL user defined inline functionsOpenCL 用户定义的内联函数
【发布时间】:2011-02-24 20:39:25
【问题描述】:

是否可以在 OpenCL 代码中定义我自己的函数,以便内核可以调用它们?是的,我在哪里可以看到一些简单的例子?

【问题讨论】:

  • 老问题...您还需要回答什么?
  • 标题和问题好像不一样?标题专门要求inline,而问题只是问我们是否可以定义我们的功能......

标签: c opencl


【解决方案1】:

OpenCL 支持辅助功能。有关示例,请参见this link 的第 19 页。

【讨论】:

  • 哦,..那里有很多关于一张好的基线卡的有用信息。不错。
  • 新链接也失效了:-P
【解决方案2】:

我用谷歌搜索了一下,然后一直回到这个问题:-P

最后,我所做的是使用宏,因为无论如何内联都是依赖于实现的,而且宏在 c99 OpenCL 程序的上下文中似乎没有任何主要缺点?例如:

#define getFilterBoardOffset( filter, inputPlane ) \
    ( ( filter * gInputPlanes + inputPlane ) * gFilterSizeSquared )
#define getResultBoardOffset( n, filter ) \
    ( ( n * gNumFilters + filter ) * gOutputBoardSizeSquared )

代替:

inline float getFilterBoardOffset( float filter, int inputPlane ) { 
    return ( filter * gInputPlanes + inputPlane ) * gFilterSizeSquared; 
}
inline float getResultBoardOffset( float n, int filter ) { 
    return ( n * gNumFilters + filter ) * gOutputBoardSizeSquared; 
}

【讨论】:

    【解决方案3】:

    用于创建程序的函数是...

    cl_program clCreateProgramWithSource  (     
        cl_context context,
        cl_uint count,
        const char **strings,
        const size_t *lengths,
        cl_int *errcode_ret)
    

    您可以像这样将函数放在 strings 参数中,

    float AddVector(float a, float b)
    {
        return a + b;
    }
    
    kernel void VectorAdd(
        global read_only float* a,
        global read_only float* b,
        global write_only float* c )
    {
        int index = get_global_id(0);
        //c[index] = a[index] + b[index];
        c[index] = AddVector(a[index], b[index]);
    }
    

    现在您有了一个用户定义的函数“AddVector”和一个内核函数“VectorAdd”

    【讨论】:

      【解决方案4】:

      基于代码示例here,您可以编写如下函数:

      inline int add(int a,int b)
      {
         return a+b;
      }
      

      (例如,查看 DXTC 或双音排序示例中的 .cl 文件。)

      我不知道这是否只是 nvidia 的扩展,但 OpenCL 文档谈到了“辅助功能”以及内核。

      【讨论】:

      • 奇怪,OpenCL 规范没有提到 __device
      • 是的。我想知道我是不是记错了。或者,如果 Apple 将其添加为扩展。因此,如果您修改了我,请再次修改我,直到经过测试:-)
      • 或者...如果我对 CUDA 代码感到困惑。我一直都在玩。
      猜你喜欢
      • 1970-01-01
      • 2011-04-04
      • 1970-01-01
      • 1970-01-01
      • 2013-06-14
      • 1970-01-01
      • 1970-01-01
      • 2021-10-28
      • 1970-01-01
      相关资源
      最近更新 更多