AMD OpenCL C编译器记录了死亡和删除的循环,这些循环不应该被删除并删除

时间:2016-02-23 11:05:07

标签: opencl gpgpu pyopencl opencl.net

我在OpenCl内核中执行了以下循环:

__kernel void kernelA(/* many parameters */)
{
    /*  Prefetching code and other stuff
     *  ...
     *  ...
     */

    float2 valueA = 0.0f;

    #pragma unroll                              //<----- line X
    for(unsigned int i = 0; i < MAX_A; i++)     // MAX_A > 0
    {
        #pragma unroll
        for(unsigned int j = 0; j < MAX_B; j++) // MAX_B > 0
            valueA += arrayA[(i * MAX_A) + j];
    }

    /*
     *  Code that uses the result saved to valueA
     */
}

可以清楚地看到,循环应总结arrayA中包含的值。现在我想尝试#pragma unroll来查看循环和展开执行之间是否存在任何性能差异。

但是当我编译内核时,编译器注意到LOOP UNROLL: pragma unroll (line X) ignored because this loop is dead and deleted.我不理解这些信息,因为循环中的代码肯定会被执行。 MAX_A和MAX_B肯定大于零,并且在循环之后也使用保存到valueA的总和。

我在代码中的其他地方具有相同的结构,并且此位置由上部注释标记。

我使用的编译器是APP SDK提供的AMD OpenCL C编译器。

1 个答案:

答案 0 :(得分:1)

@DarkZeroes的评论是这个问题的解决方案。没有指令将结果放入内核的输出数组中,因此上面的代码以及依赖于它的所有内容都被编译器优化了。