riza.guntur

Is there anyway to optimize this kernel?

Discussion created by riza.guntur on Jul 9, 2009
Latest reply on Jul 16, 2009 by gaurav.garg
[ALGORITHMICALLY ERROR,WILL BE FIXED]

I have a program code like the following:

kernel void miu(int2 size, float4 max<>, float4 min<>, float4 median<>, float4 vec_ref_max[][], float4 vec_ref_min[][], float4 vec_ref_median[][], out float4 miu<>)
{
    int2 index = instance().xy;
    int index_x = index.x;
    int index_y = index.y;
    float4 output;
    float4 tp1,tp2;
    float4 posisi_x;
    
    //size is the size of vec_ref_
    for(int i = 0; i < size.y; i++)
    {
        if (median.x == vec_ref_median[index_x].x) // berarti posisi sudah sama persih
        {
            output.x = 1.0f;
        }
        else if (median.x > vec_ref_median[index_x]
.x) // rumus a
        {
            posisi_x.x = (median.x - min.x) * vec_ref_max[index_x].x;
            posisi_x.x = posisi_x.x / (vec_ref_max.x[index_x]
- vec_ref_median[index_x].x);
            posisi_x.x = posisi_x.x + min.x;
            posisi_x.x = posisi_x.x / ( 1 + median.x - min.x)/(vec_ref_max[index_x]
.x - vec_ref_median[index_x].x));

            tp1.x = (max.x -  posisi_x.x)/(max.x - median.x);
            tp2.x = (vec_ref_max[index_x]
.x -  posisi_x.x)/(vec_ref_max[index_x].x - vec_ref_median[index_x].x);

        }
        else // if (median.x < vec_ref_median.x) // rumus b
        {
            posisi_x.x = (vec_ref_median[index_x].x - vec_ref_min[index_x].x) * max.x;
            posisi_x.x = posisi_x.x / (max.x - median.x);
            posisi_x.x = posisi_x.x + vec_ref_min[index_x].x;
            posisi_x.x = posisi_x.x / ( 1 + (vec_ref_median[index_x]
.x - vec_ref_min[index_x].x)/(max.x - median.x));

            tp1.x = (max.x -  posisi_x.x)/(max.x - median.x);
            tp2.x = (vec_ref_median[index_x]
.x -  posisi_x.x)/(vec_ref_median[index_x].x - vec_ref_min[index_x].x);

        }
       
        if ((tp1.x > 0) && (tp1.x <= 1))
        {
            output.x = tp1.x;
        }
        else if ((tp2.x>0) && (tp2.x<=1))
        {
            output.x = tp2.x;
        }
        else
        {
            output.x = 0;
        }
       
       
       
        if (median.y == vec_ref_median[index_x].y) // berarti posisi sudah sama persih
        {
            output.y = 1.0f;
        }
        else if (median.y > vec_ref_median[index_x]
.y) // rumus a
        {
            posisi_x.y = (median.y - min.y) * vec_ref_max[index_x].y;
            posisi_x.y = posisi_x.y / (vec_ref_max.y[index_x]
- vec_ref_median[index_x].y);
            posisi_x.y = posisi_x.y + min.y;
            posisi_x.y = posisi_x.y / ( 1 + median.y - min.y)/(vec_ref_max[index_x]
.y - vec_ref_median[index_x].y));

            tp1.y = (max.y -  posisi_x.y)/(max.y - median.y);
            tp2.y = (vec_ref_max[index_x]
.y -  posisi_x.y)/(vec_ref_max[index_x].y - vec_ref_median[index_x].y);

        }
        else // if (median.y < vec_ref_median.y) // rumus b
        {
            posisi_x.y = (vec_ref_median[index_x].y - vec_ref_min[index_x].y) * max.y;
            posisi_x.y = posisi_x.y / (max.y - median.y);
            posisi_x.y = posisi_x.y + vec_ref_min[index_x].y;
            posisi_x.y = posisi_x.y / ( 1 + (vec_ref_median[index_x]
.y - vec_ref_min[index_x].y)/(max.y - median.y));

            tp1.y = (max.y -  posisi_x.y)/(max.y - median.y);
            tp2.y = (vec_ref_median[index_x]
.y -  posisi_x.y)/(vec_ref_median[index_x].y - vec_ref_min[index_x].y);

        }
       
        if ((tp1.y > 0) && (tp1.y <= 1))
        {
            output.y = tp1.y;
        }
        else if ((tp2.y>0) && (tp2.y<=1))
        {
            output.y = tp2.y;
        }
        else
        {
            output.y = 0;
        }
       
       
        if (median.z == vec_ref_median[index_x].z) // berarti posisi sudah sama persih
        {
            output.z = 1.0f;
        }
        else if (median.z > vec_ref_median[index_x]
.z) // rumus a
        {
            posisi_x.z = (median.z - min.z) * vec_ref_max[index_x].z;
            posisi_x.z = posisi_x.z / (vec_ref_max.z[index_x]
- vec_ref_median[index_x].z);
            posisi_x.z = posisi_x.z + min.z;
            posisi_x.z = posisi_x.z / ( 1 + median.z - min.z)/(vec_ref_max[index_x]
.z - vec_ref_median[index_x].z));

            tp1.z = (max.z -  posisi_x.z)/(max.z - median.z);
            tp2.z = (vec_ref_max[index_x]
.z -  posisi_x.z)/(vec_ref_max[index_x].z - vec_ref_median[index_x].z);

        }
        else // if (median.z < vec_ref_median.z) // rumus b
        {
            posisi_x.z = (vec_ref_median[index_x].z - vec_ref_min[index_x].z) * max.z;
            posisi_x.z = posisi_x.z / (max.z - median.z);
            posisi_x.z = posisi_x.z + vec_ref_min[index_x].z;
            posisi_x.z = posisi_x.z / ( 1 + (vec_ref_median[index_x]
.z - vec_ref_min[index_x].z)/(max.z - median.z));

            tp1.z = (max.z -  posisi_x.z)/(max.z - median.z);
            tp2.z = (vec_ref_median[index_x]
.z -  posisi_x.z)/(vec_ref_median[index_x].z - vec_ref_min[index_x].z);

        }
       
        if ((tp1.z > 0) && (tp1.z <= 1))
        {
            output.z = tp1.z;
        }
        else if ((tp2.z>0) && (tp2.z<=1))
        {
            output.z = tp2.z;
        }
        else
        {
            output.z = 0;
        }
       
       
        if (median.w == vec_ref_median[index_x].w) // berarti posisi sudah sama persih
        {
            output.w = 1.0f;
        }
        else if (median.w > vec_ref_median[index_x]
.w) // rumus a
        {
            posisi_x.w = (median.w - min.w) * vec_ref_max[index_x].w;
            posisi_x.w = posisi_x.w / (vec_ref_max.w[index_x]
- vec_ref_median[index_x].w);
            posisi_x.w = posisi_x.w + min.w;
            posisi_x.w = posisi_x.w / ( 1 + median.w - min.w)/(vec_ref_max[index_x]
.w - vec_ref_median[index_x].w));

            tp1.w = (max.w -  posisi_x.w)/(max.w - median.w);
            tp2.w = (vec_ref_max[index_x]
.w -  posisi_x.w)/(vec_ref_max[index_x].w - vec_ref_median[index_x].w);

        }
        else // if (median.w < vec_ref_median.w) // rumus b
        {
            posisi_x.w = (vec_ref_median[index_x].w - vec_ref_min[index_x].w) * max.w;
            posisi_x.w = posisi_x.w / (max.w - median.w);
            posisi_x.w = posisi_x.w + vec_ref_min[index_x].w;
            posisi_x.w = posisi_x.w / ( 1 + (vec_ref_median[index_x]
.w - vec_ref_min[index_x].w)/(max.w - median.w));

            tp1.w = (max.w -  posisi_x.w)/(max.w - median.w);
            tp2.w = (vec_ref_median[index_x]
.w -  posisi_x.w)/(vec_ref_median[index_x].w - vec_ref_min[index_x].w);

        }
       
        if ((tp1.w > 0) && (tp1.w <= 1))
        {
            output.w = tp1.w;
        }
        else if ((tp2.w>0) && (tp2.w<=1))
        {
            output.w = tp2.w;
        }
        else
        {
            output.w = 0;
        }
    }
   
    miu = output;
}

This kernel is about to be called 1000 times.

Outcomes