首页 > 解决方案 > 为什么 clEnqueueNDRangeKernel 会因浮点异常而崩溃?

问题描述

clEnqueueNDRangeKernel()我正在尝试使用, 从 C++ 程序中启动某个内核。但是,它没有入队或返回错误,而是得到一个浮点异常信号 (SIGFPE)。

由于 IP 原因,我无法深入探讨,我很难提供触发此信号的示例。但是 - 发生这种情况似乎没有任何正当理由。是否存在该函数本身实际执行无效浮点运算的已知案例?

标签: c++signalsopenclnvidiasigfpe

解决方案


tl; dr:由于您的尺寸有问题,这是一个除以零。

使用 NVIDIA CUDA 的 OpenCL 库(至少在 v11.2.152 中),传递不同维度的工作组维度和整体网格维度确实可能会触发这种情况。OpenCL 用户过去曾报告过类似的行为。

英伟达遗憾地选择仅提供其库作为闭源,所以我只能推测原因,但似乎如下:当你cl::NDRange用二维构造 a 时,国际表示中的第三个值被初始化为 0 (明确地和必然地,或者只是有时)。现在,如果您 clEnqueueNDRangeKernel()仔细阅读文档,您会注意到全局维度和局部维度必须具有相同的维度,即相同的维度数;clEnqueueNDRangeKernel()可能假设是这种情况,并使用计算第三维中的网格块数(工作组数)global_dims_it_got[i] / local_dims_it_got[i]对于它收到的全局维度的每个维度。因此,当全局维度较高时,它最终会除以 0。这会触发 SIGFPE,尽管它的名称如此,但它不仅用于无效的浮点运算,还用于任何算术错误


推荐阅读