AMD OpenCL C 编译器记录了不应该死循环和删除循环
AMD OpenCL C Compiler notes dead and deleted loops which shouldn't be dead and deleted
我在我的 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编译器
@DarkZeroes的评论就是这个问题的解答。没有将结果放入内核输出数组的指令,因此上面的代码和依赖于它的所有内容都被编译器优化掉了。
我在我的 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编译器
@DarkZeroes的评论就是这个问题的解答。没有将结果放入内核输出数组的指令,因此上面的代码和依赖于它的所有内容都被编译器优化掉了。