我正在尝试使用float4而不是float优化一个简单的opencl内核。

这是不带float4的示例代码。

示例代码:



__kernel void Substract (
    __global const float* data,
    const float val,
    __global float* result
){
    size_t gi = get_global_id(0);
    float input_val = data[gi];
    result[gi] =  val - input_val;
}




我对float4的想法:



__kernel void substract (
    __global const float* data,
    const float val,
    __global float* result
){
    size_t gi = get_global_id(0);

    float4 val2 = float4 (val,val,val,val);
    float4 input_val = data[gi*4];


    result[gi] = val2 - input_val;

       }




但是,这不起作用,因为我们无法将float4结果写回到float数组中。是否有可能将float4写回opencl中的普通float数组?简单的想法是一个有4次运行的for循环。

我想针对gpu和cpu优化内核。
因此,如果我有一个带有float4的变量,而没有一个变量,则两者都应在完全相同的内核参数下运行。这可能吗?

最佳答案

您只需将参数声明为float4指针,而无需更改主机上的任何内容。另外,如果在包含矢量的表达式中使用标量值,则编译器应自动加宽标量值,因此您无需手动创建float4版本的val

__kernel void Substract (
    __global const float4* data,
    const float val,
    __global float4* result
){
    size_t gi = get_global_id(0);
    float4 input_val = data[gi];
    result[gi] =  val - input_val;
}

关于c++ - 将float4分配给float数组opencl,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30155642/

10-10 21:16