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

时间:2015-03-26 11:18:27

标签: opencl

我想定义两个具有相同名称的函数,但是一个在float4上应用转换,另一个在float3上应用转换,但它说:

  

' 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;
}

1 个答案:

答案 0 :(得分:3)

虽然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 ++内核语言本身就支持函数重载。