OpenCL内核迭代数升高触发CL_OUT_OF_RESOURCES错误原因咨询
错误原因分析
核心原因:触发显卡驱动的TDR(超时检测和恢复)机制
这是你遇到问题的最高概率原因,完全匹配你观测到的所有现象:
- 消费级NVIDIA显卡(如你使用的940MX)默认开启TDR机制,单次内核执行时间超过默认阈值(通常为2秒)就会被驱动强制终止,返回
CL_OUT_OF_RESOURCES错误 - 内核被强制终止时不会正常写入
CL_PROFILING_COMMAND_END时间戳,你读到的time_end是未初始化的垃圾值,因此计算出来的执行时间会异常偏高 - Titan V属于数据中心计算卡,默认关闭TDR超时限制,所以可以支持长时间高迭代数运行不受影响
循环展开+函数内联导致代码体积超限的可能性可以排除
你编译时输出的资源占用数据在不同迭代数下完全一致,说明编译器没有对外层循环做静态展开:循环是动态执行的,生成的二进制代码体积固定,不会随迭代数升高而变大,因此不存在代码体积超出GPU承载上限的问题。
编译参数含义说明
你观测到的所有资源占用都没有超出940MX的硬件限制:
- 66032字节栈帧:是单个workitem的私有内存栈占用,940MX每个SM支持的私有内存总容量远高于该值
- cmem[0]/cmem[3]:即常量内存,NVIDIA GPU单卡常量内存上限为64KB,你仅用了不到1KB,无压力
- 寄存器占用140个:256个workitem总寄存器占用为
140*256=35840,远低于单块65536的上限
本地开发临时解决方案
- 方案1:修改Windows注册表关闭TDR(操作有风险,修改前做好系统备份),去掉内核执行时间限制
- 方案2:给外层4个循环添加
__attribute__((opencl_unroll_hint(1)))编译属性,强制编译器不做循环展开,避免不必要的资源占用 - 方案3:拆分内核逻辑,把单次参数组合的计算拆成独立的内核调用,高迭代数对应多次内核入队,避免单次内核执行时间超过TDR阈值
内容的提问来源于stack exchange,提问作者Iago Storch
相关产品推荐
相关产品推荐

