opencl - 在 OpenCL 1.1 中定义具有相同名称但不同参数类型的不同函数

标签 opencl

我想定义两个同名的函数,但一个对 float4 应用转换,另一个对 float3 应用转换,但它说:

conflicting types for 'mult'

这是不可能的还是我的代码有问题?

typedef struct {
    float m[16];        // member elements of the matrix
} mat4;

typedef struct {
    float m[9];
} mat3;

float4 mult(mat4 matrix, float4 p) {
    return 
        matrix.m[0]     * p.x   + matrix.m[1]   * p.y + matrix.m[2]     * p.z + matrix.m[3]     * p.w +
        matrix.m[4]     * p.x   + matrix.m[5]   * p.y + matrix.m[6]     * p.z + matrix.m[7]     * p.w +
        matrix.m[8]     * p.x   + matrix.m[9]   * p.y + matrix.m[10]    * p.z + matrix.m[11]    * p.w +
        matrix.m[12]    * p.x   + matrix.m[13]  * p.y + matrix.m[14]    * p.z + matrix.m[15]    * p.w ;

}

float3 mult(mat4 matrix, float3 p) {
    return mult(matrix, float4(p, 1)).xyz;
}

最佳答案

尽管 OpenCL 内置函数利用函数重载来提供具有相同名称的同一函数的不同变体,但 OpenCL C 规范并未明确允许在用户代码中进行函数重载(这也不是 C99 的功能) .

某些基于 Clang 的 OpenCL 实现可能允许您使用 overloadable 函数属性,该属性如下所示:

float4 __attribute__((overloadable)) mult(mat4 matrix, float4 p) {
    ...
}

float3 __attribute__((overloadable)) mult(mat4 matrix, float3 p) {
    ...
}

但这不是标准的 OpenCL 功能,并且不保证在所有 OpenCL 平台上工作。为 OpenCL 2.1 提议的 OpenCL C++ 内核语言将原生支持函数重载。

关于opencl - 在 OpenCL 1.1 中定义具有相同名称但不同参数类型的不同函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29277087/

相关文章:

python - 在 Windows 8 (x64) 中安装 PyOpenCL "fatal error: CL/cl.h: No such file or directory"错误

c++ - clEnqueueNDRangeKernel 触发 CL_INVALID_MEM_OBJECT (-38)

algorithm - CUDA 粒子中的最近邻

opencl - OpenCL 中的障碍

OpenCL 设备查询

ios - 在 iOS 上可用 OpenCL

c - 使用 OpenCL 传输

memory - OpenCL 内存架构和 GPU 物理内存/缓存(L1/L2...)之间的关系?

c - OpenCL get_local_id() 永远不会返回 0?

c - 放弃 OpenCL 中额外全局工作 ID 的计算