Arm Mali T-624 GPU内核执行时间固定为12666ms,添加条件后耗时异常升高
问题核心原因
这是OpenCL编译器的死代码消除优化导致的现象,和Arm Mali T-624的硬件算力没有直接关系。
1. 初始内核执行时间固定的原因
你编写的初始测试内核中,x、y都是内核栈上的私有变量,整个循环的计算结果既没有写入__global指针指向的全局内存,也没有产生任何可观测的副作用。OpenCL编译器在优化阶段会直接判定这段循环是无意义的死代码,直接将其整体删除。
你观测到的固定12666.6689ms,实际上是OpenCL运行时的内核启动开销、线程组调度开销、内核返回开销的总和,和你写的循环逻辑完全没有关联:不管你把循环迭代次数改成100万还是1亿,甚至在循环里加再多无副作用的算术运算,编译器都会全部删掉,执行时间自然不会变化。
2. 添加x!=0判断后执行时间大幅上升的原因
你添加的x!=0判断是基于动态计算的无符号整数变量x的递推结果,无符号整数的溢出行为是C标准明确定义的(模2的位宽次方),编译器无法在编译期提前推导出来x会不会在循环过程中变为0,也就无法确定整个循环是否可以被安全删除,只能生成实际执行循环迭代的机器码,因此你就能观测到和循环迭代次数匹配的执行时间上升。
你可以做一个简单验证:在初始内核的循环结束后添加一行list[0] = x;将计算结果写回全局内存,哪怕不加x!=0的判断,编译器也不会删除循环,执行时间也会随迭代次数同步变化。
内容的提问来源于stack exchange,提问作者marios
相关产品推荐
相关产品推荐

