Ошибка сегментации при построении ядра OpenCL (PyOpenCL)

#python #ubuntu #opencl #archlinux #pyopencl

#питон #ubuntu #opencl #archlinux #пиопенкл

Вопрос:

может ли кто-нибудь объяснить мне, почему следующий код ядра OpenCL (предположим, что z_new-это какой-то float8):

 float fac = 0.0f; float8 square = 0.0f; square = powr(z_new[i], 2); fac  = sqrt(square.s0 square.s1 square.s2 square.s3 square.s4 square.s5);  

приводит к этой ошибке сегментации:

 Fatal Python error: Bus error  Current thread 0x00007fc40ccd1740 (most recent call first):  File "/usr/local/lib/python3.8/dist-packages/pyopencl/cache.py", line 400 in _create_built_program_from_source_cached  File "/usr/local/lib/python3.8/dist-packages/pyopencl/cache.py", line 473 in create_built_program_from_source_cached  File "/usr/local/lib/python3.8/dist-packages/pyopencl/__init__.py", line 537 in lt;lambdagt;  File "/usr/local/lib/python3.8/dist-packages/pyopencl/__init__.py", line 557 in _build_and_catch_errors  File "/usr/local/lib/python3.8/dist-packages/pyopencl/__init__.py", line 536 in build  File "/opt/pyqmri/pyqmri/_helper_fun/_clprogram.py", line 20 in __init__  File "/opt/pyqmri/test/unittests/test_LinearDataOperator_CPU.py", line 582 in setUp  File "lt;stdingt;", line 1 in lt;modulegt; Bus error (core dumped)  

если добавлена последняя строка.

Следующее работает просто отлично и достигает того же результата, но я просто озадачен, почему это произошло:

 fac = hypot(fac,  hypot(  hypot(  z_new[i].s0,  z_new[i].s1  ),  hypot(  hypot(  z_new[i].s2,  z_new[i].s3  ),  hypot(  z_new[i].s4,  z_new[i].s5  )  )  )  );  

Это происходит только при использовании одинарной точности (двойная точность работает без segfault).

Код был скомпилирован с использованием pocl версии 1.1 с Python 3.8 и PyOpenCL 2021.2.9 на Ubuntu 18.04.5 LTS.

Код отлично работает в последней версии Arch Linux с использованием тех же пакетов, что и выше.

Спасибо!