为什么多线程代码在 64 位而不是 32 位中出现 Segfault

计算科学 Python 并行计算 开放式 内存管理
2021-12-09 11:25:11

我使用 PyOpenCL 编写了一些多线程代码,在以下条件下可以正常工作:

  • GPU 32 位浮点值(Intel Iris GPU 只能处理单精度值)
  • CPU 32 位浮点值。

所有数据缓冲区都被定义,程序执行和输出数据排队,所有这些都在一个在循环中调用的函数内。使用 64 位双精度值时,循环运行两次,然后抛出错误“分段错误:11”。

因此,我不认为这是由于准备 OpenCL 内核所涉及的字符串操作。似乎更可能与分配的内存有关。

有趣的是,CPU max_work_group 是 1024,GPU max_work_group 是 512。

使用单精度值成功但使用双精度值失败的可能原因有哪些?

1个回答

如果不知道您正在使用的代码,就不可能说出来。但幸运的是,段错误很容易调试:基本上,段错误意味着您正在访问不应该访问的内存,并且操作系统会在发生这种情况时停止您的程序。这意味着,如果您在调试器下运行程序,那么您将确切地看到是哪一行导致了问题——您可以检查发生问题的行、此时的局部变量及其值,以及回溯(即,哪个函数调用了发生问题的函数,哪个函数调用了该函数,等等)。

所以,在调试器中运行你的程序,看看具体发生了什么。其他一切本质上只是猜测,可能正确也可能不正确。