【发布时间】:2021-08-23 18:29:15
【问题描述】:
我正在尝试从 C++ 程序中使用 clEnqueueNDRangeKernel() 启动某个内核。但它不是入队或返回错误,而是获得一个浮点异常信号 (SIGFPE)。
由于我无法深入探讨的 IP 原因,我很难提供触发此信号的示例。但是 - 发生这种情况似乎没有任何正当理由。是否存在该函数本身实际执行无效浮点运算的已知案例?
【问题讨论】:
标签: c++ signals opencl nvidia sigfpe
我正在尝试从 C++ 程序中使用 clEnqueueNDRangeKernel() 启动某个内核。但它不是入队或返回错误,而是获得一个浮点异常信号 (SIGFPE)。
由于我无法深入探讨的 IP 原因,我很难提供触发此信号的示例。但是 - 发生这种情况似乎没有任何正当理由。是否存在该函数本身实际执行无效浮点运算的已知案例?
【问题讨论】:
标签: c++ signals opencl nvidia sigfpe
使用 NVIDIA CUDA 的 OpenCL 库(至少在 v11.2.152 中),传递工作组维度和不同维度的整体网格维度确实可能会触发这种情况。 OpenCL 用户have reported 过去有类似行为。
NVIDIA 遗憾地选择仅将其库作为封闭源提供,因此我只能推测原因,但似乎如下:当您构造具有二维的 cl::NDRange 时,第三个值在国际表示被初始化为 0(明确地和必然地,或者只是有时)。现在,如果您仔细阅读clEnqueueNDRangeKernel() 的文档,您会注意到全局维度和局部维度必须具有相同的维度,即相同的维度数; clEnqueueNDRangeKernel() 可能假设是这种情况,并使用global_dims_it_got[i] / local_dims_it_got[i] 为其接收到的全局维度的每个维度计算第三维度中的网格块数(工作组数)。因此,当全局维度较高时,它最终会除以 0。这会触发 SIGFPE,尽管它的名称如此,但它不仅用于无效的浮点运算,还用于 any arithmetic error。
【讨论】: