c++ - 为什么 clEnqueueNDRangeKernel 会因浮点异常而崩溃?
问题描述
clEnqueueNDRangeKernel()
我正在尝试使用, 从 C++ 程序中启动某个内核。但是,它没有入队或返回错误,而是得到一个浮点异常信号 (SIGFPE)。
由于 IP 原因,我无法深入探讨,我很难提供触发此信号的示例。但是 - 发生这种情况似乎没有任何正当理由。是否存在该函数本身实际执行无效浮点运算的已知案例?
解决方案
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,尽管它的名称如此,但它不仅用于无效的浮点运算,还用于任何算术错误。
推荐阅读
- php - 比较 Carbon startOfDay() 和 now()->startOfDay() 不能正常工作
- scala - circe 自动将 json 解析为案例类,但缺少一些键值
- python - 如何解决子图中的线不可见
- reactjs - 使用 React 测试库和 Mock Service Worker 测试 React 模式的最佳实践?
- opencv - OpenCV 中是否有等效功能或 skimage.feature.peak_local_max 的实现?
- mysql - 无延迟的实时数据处理
- python - 为 lag_plot 创建子图
- c++ - 静态 constinit 成员变量是否与非类型模板参数相同?
- mysql - 使用 php 或/和 mysql 计算多边形的平方米面积
- c# - C# Selenium - 无法定位元素